バックグラウンド
プロジェクトレベルのweb.configファイルでフォーム認証が有効になっているMVC2プロジェクトがあります。
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn"
defaultUrl="~/Magic"
name="MagicAuthCookie"
slidingExpiration="false"
timeout="10" />
</authentication>
カスタムMembershipProviderもそこで宣言されています:
<membership defaultProvider="MagicMembershipProvider">
<providers>
<clear/>
<add name="MagicMembershipProvider"
type="Magic.Web.Areas.Accounts.Providers.MagicMembershipProvider,
Magic.Web"
applicationName="MagicalMysteryProject"
connectionStringName="Test_User_and_RolesConnectionString"/>
</providers>
</membership>
[承認]属性で装飾されたインデックスアクションがあります。
[Authorize]
public ActionResult Index()
{
MagicViewModel avm = new MagicViewModel { MagicDate = DateTime.Now.ToString("MM-dd-yyyy") };
return View(avm);
}
流れを感じる
プロジェクトをデバッグすると、最初にweb.configで指定されている〜/ Account/LogOnコントローラー/アクションにリダイレクトされます。
public ActionResult LogOn(string returnUrl)
{
if (ModelState.IsValid && MembershipService.ValidateUser(User.Identity.Name, "")){
*... do some stuff here ...*
}
}
注:この時点で、コントローラーの「ユーザー」プロパティはNullです。
ModelStateを確認した後、それは私のMembershipService、別名AccountModels.ValidateUser(username、password)に移動します。
public bool ValidateUser(string userName, string password)
{
return _provider.ValidateUser(userName, password);
}
これはMagicMembershipProvider.ValidateUser(username、password)に行きます:
public override bool ValidateUser(string username, string password)
{
return base.ValidateUser(username, password);
}
最終的にBaseMembershipProvider.ValidateUser(username、password)に移動します。
public override bool ValidateUser(string username, string password)
{
string magicUserName =
HttpContext.Current.Request.ServerVariables["MAGIC_USER_NAME"];
return (!magicUserName == "");
}
サーバー変数は、すべての呼び出しをインターセプトして認証を行うカスタムisapi.dllによって早い段階で設定されます。そこに値がある場合、ユーザーは本物と見なされます。このメソッドは単純なブール値を返します。NO WHERE ELSE IN MY CODEは、この変数が参照または渡されます。
このブール値は、(より適切な単語がないために)実行ツリーに戻され、LogOn(string returnUrl)
すべてを開始した元のメソッドに戻されます。
キッカー
さて、この時点で、どういうわけか魔法のようにUserプロパティはnullではなくなり、User.Identity.Nameプロパティはサーバー変数からMagicUserNameに設定されます。 私はこれをしませんでした。
どうした?
この動作は私が望んでいるものではありませんが、フレームワークにこれを行うように指示したことがないため、どこで/どのように停止するかわかりません。デフォルトのAuthorizeAttribute実装のどこかにあると思いますが、チェックしたこのランダムなサーバー変数を使用することをどのようにして知ることができますか?
どんな照明でも大歓迎です。