1

背景

我有一个 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(用户名,密码):

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 实现中的某个地方,但是它如何知道使用我检查的这个随机服务器变量?

任何照明将不胜感激。

4

1 回答 1

3

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

于 2011-03-01T07:26:11.297 回答