我正在将使用 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 中复制此行为?我发现了如何使用 Windows 身份验证Microsoft.AspNetCore.Authentication.Negotiate
NuGet 包和配置:
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
,我们添加了另外 2 个身份验证方案,名为CookieScheme
and JwtBearerDefaults.AuthenticationScheme
对应 Cookie 和 Jwt 身份验证的常量。
然后将我们的默认身份验证方案定义为基于标头信息的身份验证机制的路由。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)