首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC2 AuthorizeAttribute -怎么回事?

问MVC2 AuthorizeAttribute -怎么回事?
EN

Stack Overflow用户
提问于 2011-03-01 04:46:20
回答 1查看 891关注 0票数 1

背景

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

代码语言:javascript
复制
<authentication mode="Forms">
    <forms loginUrl="~/Account/LogOn"
           defaultUrl="~/Magic"
           name="MagicAuthCookie"
           slidingExpiration="false"                    
           timeout="10" />
    </authentication>

我还在那里声明了一个定制的MembershipProvider:

代码语言:javascript
复制
<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>

我有一个Index操作,它被修饰为授权属性:

代码语言:javascript
复制
[Authorize]
public ActionResult Index()
{
    MagicViewModel avm = new MagicViewModel { MagicDate = DateTime.Now.ToString("MM-dd-yyyy") };
    return View(avm);
}

费林流

调试项目时,首先重定向到web.config中指定的~/Account/LogOn控制器/操作:

代码语言:javascript
复制
    public ActionResult LogOn(string returnUrl)
    {
        if (ModelState.IsValid && MembershipService.ValidateUser(User.Identity.Name, "")){
            *... do some stuff here ...*
        }
    }

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

在检查ModelState之后,它将转到我的MembershipService,又名AccountModels.ValidateUser(用户名、密码):

代码语言:javascript
复制
    public bool ValidateUser(string userName, string password)
    {
        return _provider.ValidateUser(userName, password);
    }

它进入MagicMembershipProvider.ValidateUser(username,密码):

代码语言:javascript
复制
public override bool ValidateUser(string username, string password)
{
    return base.ValidateUser(username, password);
}

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

代码语言:javascript
复制
public override bool ValidateUser(string username, string password)
{
    string magicUserName = 
        HttpContext.Current.Request.ServerVariables["MAGIC_USER_NAME"];
    return (!magicUserName == "");
}

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

此布尔值将返回执行树(因为缺少更好的单词)到启动它的原始LogOn(string returnUrl)方法。

淘汰机

现在,从某种程度上说,用户属性不再为null,User.Identity.Name属性从MagicUserName变量设置为MagicUserName。这不是我干的。

发生了什么?

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

任何照明都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-01 07:26:11

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5150552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档