使用AuthorizationAttribute的可选身份验证

时间:2019-06-25 02:54:20

标签: c# asp.net-mvc authentication asp.net-core authorization

我有一个使用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]属性?

0 个答案:

没有答案