Фон
У меня есть проект 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]:
[Authorize]
public ActionResult Index()
{
MagicViewModel avm = new MagicViewModel { MagicDate = DateTime.Now.ToString("MM-dd-yyyy") };
return View(avm);
}
Feelin 'The Flow
Когда я отлаживаю проект, меня первоначально перенаправляют на контроллер / действие ~ / Account / LogOn, как указано в web.config:
public ActionResult LogOn(string returnUrl)
{
if (ModelState.IsValid && MembershipService.ValidateUser(User.Identity.Name, "")){
*... do some stuff here ...*
}
}
ПРИМЕЧАНИЕ. На этом этапе свойство «Пользователь» контроллера равно 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, который перехватывает все вызовы и выполняет аутентификацию. Если там есть значение, пользователь считается подлинным. Этот метод возвращает простое логическое значение. НЕТ, ГДЕ ЕЩЕ В МОЕМ КОДЕ, на эту переменную ссылаются или передают.
Этот логический аргумент передается обратно в дерево выполнения (из-за отсутствия лучшего слова) в оригинальный метод LogOn(string returnUrl)
, который запустил все это.
Kicker
Теперь на этом этапе каким-то волшебным образом свойство User больше не равно NULL, а свойству User.Identity.Name присваивается значение MagicUserName из серверной переменной. Я этого не делал .
Что случилось?
Это поведение не то, что я хочу, но я не знаю, где / как это остановить, потому что я никогда не говорил фреймворку делать это. Я предполагаю, что это где-то в реализации AuthorizeAttribute по умолчанию, но как узнать, что я использовал эту случайную переменную сервера, которую я проверил?
Любое освещение будет высоко оценено.