MVC2 AuthorizeAttribute - 这里有什么?

时间:2011-03-01 04:46:21

标签: asp.net-mvc-2 authorize asp.net-authorization authorize-attribute

背景

我有一个MVC2项目,在项目级web.config文件中启用了表单身份验证:

<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]属性修饰的索引操作:

[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 ...*
        }
    }

注意:此时控制器的“User”属性为Null

检查ModelState后,它会转到我的MembershipService,即AccountModels.ValidateUser(用户名,密码):

    public bool ValidateUser(string userName, string password)
    {
        return _provider.ValidateUser(userName, password);
    }

其中有MagicMembershipProvider.ValidateUser(用户名,密码):

public override bool ValidateUser(string username, string password)
{
    return base.ValidateUser(username, password);
}

最后转到BaseMembershipProvider.ValidateUser(用户名,密码):

public override bool ValidateUser(string username, string password)
{
    string magicUserName = 
        HttpContext.Current.Request.ServerVariables["MAGIC_USER_NAME"];
    return (!magicUserName == "");
}

服务器变量早期由自定义isapi.dll设置,该拦截拦截所有调用并进行身份验证。如果那里有值,则认为用户是真实的。此方法返回一个简单的布尔值。否我的代码中的ELSE是引用或传递的变量。

这个布尔值被传递回执行树(缺少一个更好的单词)到原始的LogOn(string returnUrl)方法启动它。

踢球者

现在,在这一点上,不可思议地,User属性不再是null,并且User.Identity.Name属性从Server Variable设置为MagicUserName。 我没有这样做

发生了什么?

这种行为不是我想要的,但我不知道在哪里/如何阻止它,因为我从未告诉框架这样做。我假设它在默认的AuthorizeAttribute实现中的某个地方,但它如何知道使用我检查的这个随机服务器变量?

非常感谢任何照明。

1 个答案:

答案 0 :(得分:3)

这就是默认情况下Forms身份验证的工作原理,与ASP.NET MVC无关。当您创建身份验证cookie(FormsAuthentication.SetAuthCookie)以指示用户成功签署此cookie时,表单身份验证模块将使用(IPrincipal在FormsAuthenticationModule.OnAuthenticate方法中设置)以填充User属性后续请求。您可以编写自定义Authorize属性并将User属性设置为您喜欢的任何属性。此技术通常用于创建自定义主体。