#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 — волшебство, пока вы не столкнетесь с проблемой, а затем неудачный взлом, когда вы сталкиваетесь с проблемами.