他の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");
}
}