#c# #asp.net-core #owin #windows-authentication #asp.net-core-authenticationhandler
#c# #asp.сетевое ядро #оуин #проверка подлинности Windows #asp.net-ядро-обработчик аутентификации
Вопрос:
Я переношу автономный веб-API, построенный с использованием OWIN и .NET Framework, на ASP.NET Основной веб-API (с использованием .NET 6.0)
В исходном API у меня есть пользовательский механизм аутентификации, который динамически выбирает схему аутентификации для каждого вызова на основе заголовка в запросе:
HttpListener listener = (HttpListener)appBuilder.Properties["System.Net.HttpListener"]; listener.AuthenticationSchemeSelectorDelegate = new AuthenticationSchemeSelector((httpRequest) =gt; { if(httpRequest.Headers.AllKeys.Any(k =gt; k == "MyCustomHeader")) { return AuthenticationSchemes.Ntlm; } else { return AuthenticationSchemes.Anonymous; } });
В принципе, для каждого запроса я проверяю определенный заголовок в запросе и на основе этого выбираю, следует ли принудительно использовать проверку подлинности Windows или разрешить выполнение запроса анонимно.
Как я могу воспроизвести это поведение в ASP.net Основной веб-api? Я узнал, как использовать проверку подлинности Windows, используя Microsoft.AspNetCore.Authentication.Negotiate
пакет NuGet и настроив:
services.AddAuthentication(NegotiateDefaults.AuthenticationScheme) .AddNegotiate();
однако я не знаю, как динамически выбрать, использовать ли эту схему или разрешить анонимный вызов на основе заголовка, как я делал раньше.
Возможно ли это? Как я могу это сделать?
Ответ №1:
Вот такой своеобразный подход
services.AddAuthentication(opts =gt; { opts.DefaultScheme = "DynamicAuthenticationScheme"; }) .AddSchemelt;SystemSessionAuthenticationRelatedOptions, SystemAuthenticationRelatedHandlergt;( CommonConstants.SessionAuthentication, x =gt; x.Test = "Ran in here") .AddCookie("CookieScheme") .AddJwtBearer(options =gt; { options.Authority = identityUrl; options.Audience = "shipping"; options.RequireHttpsMetadata = false; }) .AddPolicyScheme("DynamicAuthenticationScheme", "Default system policy", cfgOpts =gt; cfgOpts.ForwardDefaultSelector = ctx =gt; ctx.Request.Headers.ContainsKey("IsTheSecretHeaderPresent?") ? "CookieScheme" : JwtBearerDefaults.AuthenticationScheme);
Идея состояла в том , чтобы указать схему аутентификации по умолчанию DynamicAuthenticationScheme
, и мы добавляем еще 2 схемы аутентификации с именем CookieScheme
и JwtBearerDefaults.AuthenticationScheme
константой для аутентификации Cookie и Jwt соответственно.
Затем определите нашу схему аутентификации по умолчанию как механизм маршрутизации для аутентификации на основе информации заголовка.
Комментарии:
1. Спасибо, это сработало!