Как упорядочить идентификатор пользователя HttpContext?

#asp.net-core

#asp.net-ядро

Вопрос:

Я хочу поддерживать несколько схем аутентификации, которые у меня успешно работают.

В моем контроллере я хочу отслеживать доступ к определенным маршрутам (регистрируя имя пользователя, которое я получаю из утверждений из моих схем аутентификации) с помощью User.FindFirst(....) . ClaimsPrincipal взаимодействует с утверждениями, просматривая порядок объектов ClaimsIdentity в свойстве Identities.

Однако я хочу, чтобы значение UserName исходило из второго идентификатора утверждения в этом перечисляемом, если присутствуют оба идентификатора утверждения.

В принципе, я хочу изменить порядок идентификаторов утверждений в ClaimPrincipal, чтобы получить желаемый приоритет поиска — для этого я добавил некоторое промежуточное программное обеспечение.

Однако, хотя я знаю, что это изменение порядка работает, когда логика в конечном итоге попадает в код моего контроллера, порядок возвращается к исходному порядку. Я даже пытался удалить один из идентификаторов утверждений в моем промежуточном программном обеспечении, но когда он попадает на мой контроллер, оба идентификатора утверждений возвращаются в массив.

Возможно ли это сделать?

 public class IdentityOrderingMiddleware
{
    private readonly RequestDelegate _next;

    public IdentityOrderingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        context.User = new ClaimsPrincipal(context.User.Identities.OrderBy(i => i.AuthenticationType == "Cookies" ? 1 : 0));
        // context.User = new ClaimsPrincipal(context.User.Identities.Where(i => i.AuthenticationType != "Cookies"));
        
        await _next(context).ConfigureAwait(false);
    }
}
  

Что-то воссоздает HttpContext.Пользователь (ClaimPrincipal) после моего промежуточного программного обеспечения? Я зарегистрировал свое промежуточное программное обеспечение после app.UseAuthentication() и app.UseAuthorization() .

Комментарии:

1. Если возможно, вы можете попытаться достичь того же, проверив User.Identity.AuthenticationType и получить конкретное утверждение в методе действия контроллера.

2. Это в значительной степени то, что я сделал в конце — я хочу проверить все идентификаторы в массиве, но в определенном порядке. В отложенном свойстве моего базового контроллера у меня теперь есть свойство UserOrdered, которое выполняет new Lazy<ClaimsPrincipal>(() => new ClaimsPrincipal(User.Identities.OrderBy(...) . Не похоже, что я сделал это правильно , но я сдался. К сожалению, это похоже на типичные фреймворки MS — волшебство, пока вы не столкнетесь с проблемой, а затем неудачный взлом, когда вы сталкиваетесь с проблемами.