【问题标题】:MVC2 AuthorizeAttribute - What's Going On Here?MVC2 AuthorizeAttribute - 这是怎么回事?
【发布时间】:2011-07-06 06:03:43
【问题描述】:

背景

我有一个 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 ...*
        }
    }

注意:此时控制器的“用户”属性为 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 提前设置,它拦截所有调用并进行身份验证。如果那里有值,则认为用户是真实的。此方法返回一个简单的布尔值。在我的代码中没有其他地方引用或传递了这个变量。

这个布尔值被传递回执行树(因为没有更好的词)到最初的 LogOn(string returnUrl) 方法,这一切都开始了。

踢球者

现在,在这一点上,不知何故,用户属性不再为空,并且 User.Identity.Name 属性设置为服务器变量中的 MagicUserName。 我没有这样做

发生了什么?

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

任何照明都将不胜感激。

【问题讨论】:

  • 不太可能是AuthorizeAttribute。你说你被重定向到你的登录页面,这意味着它正在正确地执行它的工作,并且此时它已经完成并且不再涉及。由于 ASP.NET MVC 是开源的,因此您可以查看实际文件 here,您将看到 User.Identity.Name 已被访问但未分配到。如果您从 isapi 发布相关代码可能会有所帮助。此外,可能不相关,但您的基本提供程序 ValidateUser 看起来像是应用时出现的编译错误!到一个字符串变量。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2022-01-23
    • 2020-04-03
    • 2018-06-20
    • 2011-08-25
    相关资源
    最近更新 更多