我正在将使用OWIN和.NET Framework构建的自托管web API移植到ASP.NET Core web API(使用.NET 6.0(
在最初的API中,我有一个自定义的身份验证机制,它根据请求中的头动态地为每个调用选择身份验证方案:
HttpListener listener = (HttpListener)appBuilder.Properties["System.Net.HttpListener"];
listener.AuthenticationSchemeSelectorDelegate = new AuthenticationSchemeSelector((httpRequest) =>
{
if(httpRequest.Headers.AllKeys.Any(k => k == "MyCustomHeader"))
{
return AuthenticationSchemes.Ntlm;
}
else
{
return AuthenticationSchemes.Anonymous;
}
});
基本上,对于每个请求,我都会检查请求中的特定标头,并基于此选择是强制请求使用Windows身份验证还是允许请求匿名进行。
如何在ASP.net Core web api中复制这种行为?我通过使用Microsoft.AspNetCore.Authentication.Negotiate
NuGet包和配置:了解了如何使用Windows身份验证
services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
.AddNegotiate();
然而,我不知道如何像以前那样,根据头动态选择是使用该方案还是允许匿名调用。
这可能吗?我该怎么做?
以下是的一种方法
services.AddAuthentication(opts =>
{
opts.DefaultScheme = "DynamicAuthenticationScheme";
})
.AddScheme<SystemSessionAuthenticationRelatedOptions, SystemAuthenticationRelatedHandler>(
CommonConstants.SessionAuthentication, x => x.Test = "Ran in here")
.AddCookie("CookieScheme")
.AddJwtBearer(options =>
{
options.Authority = identityUrl;
options.Audience = "shipping";
options.RequireHttpsMetadata = false;
})
.AddPolicyScheme("DynamicAuthenticationScheme", "Default system policy",
cfgOpts => cfgOpts.ForwardDefaultSelector = ctx =>
ctx.Request.Headers.ContainsKey("IsTheSecretHeaderPresent?")
? "CookieScheme"
: JwtBearerDefaults.AuthenticationScheme);
其思想是为DynamicAuthenticationScheme
指定一个默认的身份验证方案,并相应地为Cookie和Jwt身份验证添加了另外两个名为CookieScheme
和JwtBearerDefaults.AuthenticationScheme
常量的身份验证机制。
然后将我们的默认身份验证方案定义为基于标头信息的身份验证机制的路由。