背景
我有一个 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 实现中的某个地方,但是它如何知道使用我检查的这个随机服务器变量?
任何照明将不胜感激。