1

他のWebアプリケーションの管理と起動に使用される古いクラシックaspアプリがあります。

アプリを起動する方法は次のとおりです。

<form name="frmMain" action="http://xxxx/mvc3app/Index" target=_self method=post>
<script language="javascript">
frmMain.submit();
</script>

ユーザーのログインとパスワードは、リクエストの一部として渡されます。

ASP.NETアプリでユーザーを認証するには、次のAuthenticateUser関数を呼び出します。

public bool AuthenticateUser()
{

 var userName = Context.Request["txtName"];
 var password = Context.Request["txtPassword"];   

    if (Membership.ValidateUser(userName, password))
    {
       FormsAuthentication.SetAuthCookie(userName, true);              
    }
}

AuthenticateUserを呼び出す正しい場所はSession_Start()、global.asaxのメソッドであると想定しましたが、「frmMain」を送信するときにこのメソッドが呼び出されていないようです。断続的に動作するようです。IEを完全に閉じた場合は、再試行してからURLを手動で入力してください。

void Session_Start(object sender, EventArgs e)
{
   Log("In Session Start");
   AthenticateUser();
}

ASP.NETアプリでユーザーを認証するための正しい場所はどこですか?

これは、authが失敗する形式の開発ツールからの画面です-Session_Start()は呼び出されません。

ここに画像の説明を入力してください

編集

IsAuthenticatedプロパティは後続のリクエストでのみ設定され、インデックスアクションで認証が失敗するため、これは機能していなかったようです。

これを今すぐテストしますが、HttpContext.User.IdentityのIsAuthenticatedプロパティを誰が設定するかを確認します。

解決:

最初のエラーは、インデックスビューの認証に失敗する原因となっていたSetAuthCookieを呼び出した後にリダイレクトされませんでした。

また、これをglobal.asaxに配置する必要はないことにも気付きましたが、インデックスアクションに直接移動するのではなく、LogOnアクションにリダイレクトすることもできます。

public ActionResult LogOn()
    {            

    var userName = Context.Request["txtName"];
    var password = Context.Request["txtPassword"];

            if (Membership.ValidateUser(userName, password))
            {
                FormsAuthentication.SetAuthCookie(userName, false);
                return RedirectToAction("Index", "Index");
            }

            else
            {
               return RedirectToAction("IncorrectLogin", "Index");
            }
    }
4

1 に答える 1

1

コントローラーアクションが最適な場所だと思います。肥大化しないように、コントローラーアクションを最小限に抑えることをお勧めします。しかし、アクションがあまりにも多くのレイヤーに触れていない場合、それは適切であるように思われます。

セッション操作で「奇妙な」ことをしている場合でも、それでも使用できSession_Startます。しかし、可能であればそれを避けてください。あなた自身のアプリケーション実行パスであなたを混乱させるために至る所で起こっている魔法のようなものは何もありません:D

于 2012-07-24T10:18:33.853 に答える