Динамически выбранная схема аутентификации в ASP.net Основной Wep Api

#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. Спасибо, это сработало!