背景
我有一个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>我有一个Index操作,它被修饰为授权属性:
[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(username,密码):
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设置,它拦截所有调用并执行身份验证。如果那里有一个值,用户就被认为是真实的。此方法返回一个简单的布尔值。不在我的代码中引用或传递这个变量的其他地方。
此布尔值将返回执行树(因为缺少更好的单词)到启动它的原始LogOn(string returnUrl)方法。
淘汰机
现在,从某种程度上说,用户属性不再为null,User.Identity.Name属性从MagicUserName变量设置为MagicUserName。这不是我干的。
发生了什么?
这种行为不是我想要的,但我不知道在哪里/如何阻止它,因为我从未告诉框架这样做。我假设它在默认的AuthorizeAttribute实现中,但是它如何知道如何使用我检查过的随机服务器变量?
任何照明都将不胜感激。
发布于 2011-03-01 07:26:11
这就是表单身份验证在默认情况下的工作方式,与ASP.NET MVC无关。创建身份验证cookie (FormsAuthentication.SetAuthCookie)以指示表单身份验证模块(在FormsAuthenticationModule.OnAuthenticate方法中设置IPrincipal )将使用该cookie成功签名的用户在随后的请求中填充用户属性时。您可以编写自定义的Authorize属性,并将用户属性设置为任何您喜欢的属性。此技术通常用于创建自定义主体。
https://stackoverflow.com/questions/5150552
复制相似问题