ASP.NET MVC пользовательские IPrincipal инъекции - PullRequest
10 голосов
/ 12 октября 2009

Я работаю над приложением, использующим ASP.NET MVC 1.0, и пытаюсь внедрить пользовательский объект IPrincipal в объект HttpContext.Current.User.

В традиционном приложении WebForms я использовал событие Application_AuthenticateRequest, чтобы сделать это следующим образом.

protected void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        if (HttpContext.Current.User != null)
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                if (HttpContext.Current.User.Identity is FormsIdentity)
                {
                    // Get Forms Identity From Current User
                    FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
                    // Get Forms Ticket From Identity object
                    FormsAuthenticationTicket ticket = id.Ticket;
                    // Create a new Generic Principal Instance and assign to Current User
                    SiteUser siteUser = new SiteUser(Convert.ToInt32(id.Name));

                    HttpContext.Current.User = siteUser;
                }
            }
        }

    }

Таким образом, с помощью этого я смог получить доступ к своему пользовательскому IPrincipal, явно приведя объект User к типу SiteUser. Я на самом деле сделал это, имея собственный класс, который наследовали все страницы, и который делал это под прикрытием для меня.

Во всяком случае, моя проблема в том, что в ASP.NET MVC приложение_AuthenticateRequest, похоже, срабатывает всякий раз, когда делается какой-либо запрос (например, для файлов JS, изображений и т. Д.), Который приводит к смерти приложения.

Будем весьма благодарны за любую помощь или предложения относительно того, как я могу добавить свой собственный IPrincipal в объект HttpContext.Current.User в ASP.NET MVC 1.0. Я видел следующий пост о SO, но, похоже, он не отвечал тем, чего я пытаюсь достичь: ASP.NET MVC - Установить пользовательский IIdentity или IPrincipal

ТИА.

Ответы [ 2 ]

8 голосов
/ 14 октября 2009

моя проблема в том, что с ASP.NET MVC Application_AuthenticateRequest кажется срабатывает всякий раз, когда любой запрос сделано (так для файлов JS, изображений и т. д.) что приводит к смерти приложения.

Это не единственная проблема MVC - если вы запустите приложение на IIS7 с интегрированным конвейером, вы увидите то же самое.

Если проблема с поиском связана с масштабируемостью, то я предполагаю, что настоящая проблема находится в пределах

FormsAuthenticationTicket ticket = id.Ticket;
SiteUser siteUser = new SiteUser(Convert.ToInt32(id.Name));

Я предполагаю, что ваш класс SiteUser выполняет поиск в базе данных. Если вы посмотрите, как работает форма auth, заявка содержит всю информацию, необходимую для создания FormsIdentity (это не относится к ролям, если вы специально не включили кэширование ролей в куки). Таким образом, вы должны смотреть на тот же подход. В первый раз, когда вы создаете свой объект siteUser, кэшируете его в подписанном файле cookie, а затем используете файл cookie для повторного увлажнения свойств SiteUser при последующих запросах.

Если вы сделаете это, то сможете пойти еще дальше, заменив принцип Thread вашим SiteUser или, по крайней мере, пользовательскую комбинацию IPrincipal / IUser, содержащую ту же информацию, что и ваш класс SiteUser.

Так что внутри AuthenticateRequest у вас будет поток вроде

SiteUserSecurityToken sessionToken = null;
if (TryReadSiteUserSecurityToken(ref sessionToken) && sessionToken != null)
{
    // Call functions to attach my principal.
}
else
{
    if (HttpContext.Current.User != null && 
        HttpContext.Current.User.Identity.IsAuthenticated && 
        HttpContext.Current.User.Identity is FormsIdentity)
    {
        // Get my SiteUser object

        // Create SiteUserSecurityToken

        // Call functions to attach my principal.
    }
}

И функция для присоединения принципала будет содержать что-то вроде

HttpContext.Current.User = sessionSecurityToken.ClaimsPrincipal;
Thread.CurrentPrincipal = sessionSecurityToken.ClaimsPrincipal;
this.ContextSessionSecurityToken = sessionSecurityToken;

Вы хотите убедиться, что функции, которые записывают токен безопасности в файл cookie, добавляют, как минимум, значение контрольной суммы / MAC и, если хотите, поддерживают шифрование с использованием ключа компьютера, если он настроен на выполнение. так. Функции чтения должны проверять эти значения.

1 голос
/ 13 октября 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...