1

バックグラウンド

プロジェクトレベルの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実装のどこかにあると思いますが、チェックしたこのランダムなサーバー変数を使用することをどのようにして知ることができますか?

どんな照明でも大歓迎です。

4

1 に答える 1

3

これがフォーム認証の既定の動作であり、ASP.NET MVC とは関係ありません。認証 Cookie ( FormsAuthentication.SetAuthCookie) を作成して、ユーザーが正常に署名したことを示す場合、この Cookie はフォーム認証モジュール (メソッド内で IPrincipal が設定されます) によって使用され、FormsAuthenticationModule.OnAuthenticate後続の要求で User プロパティが入力されます。カスタムAuthorize属性を作成し、ユーザー プロパティを好きなように設定することができます。この手法は、カスタム プリンシパルを作成するためによく使用されます。

于 2011-03-01T07:26:11.297 に答える