ASP.NET MVC пользовательская инжекция IPrincipal

Как то, на что уже указало столько людей, ответ здесь, "он зависит". Существуют некоторые вещи как операции повторения , которые являются намного более простыми и более чистыми в NAnt. См. форумы MSDN для дискуссии об этом.

10
задан Community 23 May 2017 в 12:26
поделиться

2 ответа

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

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

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

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

. Я предполагаю, что ваш класс SiteUser выполняет своего рода поиск в базе данных. Если вы изучите, как работает проверка подлинности форм, билет будет содержать всю информацию, необходимую для создания FormsIdentity (это не относится к ролям, если вы специально не включили кэширование ролей в cookie). Так что вам следует использовать тот же подход. В первый раз, когда вы создаете свой объект 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 и, если хотите, поддерживают шифрование с использованием машины ключ, если он настроен для этого. Функции чтения должны проверять эти значения.

d иметь некоторый поток вроде

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 значение и, если хотите, поддерживать шифрование с использованием машинного ключа, если он настроен для этого. Функции чтения должны проверять эти значения.

d иметь некоторый поток вроде

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 значение и, если хотите, поддерживать шифрование с использованием машинного ключа, если он настроен для этого. Функции чтения должны проверять эти значения.

8
ответ дан 4 December 2019 в 01:57
поделиться

This sounds like a job for a custom Authorization Filter.

1
ответ дан 4 December 2019 в 01:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: