MVC2 AuthorizeAttribute - что здесь происходит? - PullRequest
1 голос
/ 01 марта 2011

Фон

У меня есть проект 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 по умолчанию, но как узнать, что я использовал эту случайную переменную сервера, которую я проверил?

Любое освещение будет высоко оценено.

1 Ответ

3 голосов
/ 01 марта 2011

Вот как проверка подлинности с помощью форм работает по умолчанию и не имеет ничего общего с ASP.NET MVC.Когда вы создаете куки аутентификации (FormsAuthentication.SetAuthCookie), чтобы указать, что пользователь успешно подписал этот куки, он будет использоваться модулем аутентификации форм (IPrincipal установлен внутри метода FormsAuthenticationModule.OnAuthenticate) для заполнения Пользователянедвижимость по последующим запросам.У вас есть возможность написать собственный атрибут Authorize и установить для свойства User любое значение.Этот метод часто используется для создания пользовательских принципалов.

...