我有一个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实现中的某个地方,但它如何知道使用我检查的这个随机服务器变量?
非常感谢任何照明。
答案 0 :(得分:3)
这就是默认情况下Forms身份验证的工作原理,与ASP.NET MVC无关。当您创建身份验证cookie(FormsAuthentication.SetAuthCookie
)以指示用户成功签署此cookie时,表单身份验证模块将使用(IPrincipal在FormsAuthenticationModule.OnAuthenticate
方法中设置)以填充User属性后续请求。您可以编写自定义Authorize
属性并将User属性设置为您喜欢的任何属性。此技术通常用于创建自定义主体。