我有一个使用AAD身份验证项目生成器的ASP.NET Core应用程序。如果用户未通过身份验证,则将他们重定向到AAD登录页面。生成器在Startup.ConfigureServices
services
.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => Configuration.Bind("AzureAd", options));
services
.AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
我想使用AppSettings.json标志来切换此行为。我尝试有条件地应用中间件,但是似乎没有办法基于AppSettings.json设置有条件地应用[Authorization]
属性。在与同事交谈时,他们建议使用“匿名”身份验证提供程序,该提供程序生成一个空的ClaimsPrincipal
,以便[Authorization]
通过。我正在努力寻找一个清晰的示例,并尝试使用自己的AuthenticationHandler<AuthenticationSchemeOptions>
来实现此目的:
public class AnonymousAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
public static readonly string AuthenticationScheme = "Anonymous";
public AnonymousAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)
: base(options, logger, encoder, clock)
{
}
/// <inheritdoc/>
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
var principal = new ClaimsPrincipal();
var ticket = new AuthenticationTicket(principal, AuthenticationScheme);
return Task.FromResult(AuthenticateResult.Success(ticket));
}
}
我既不确定这是否可行,也不确定如何将该处理程序实际集成到我的中间件管道中。我通常没有找到一个明确的解决方案,但更糟糕的是,似乎已弃用了AddScheme
中间件,该中间件已在大多数/所有示例中使用。
如何基于AppSettings.json值有条件地应用[Authorization]
属性?