混合Azure AD和JWT身份验证方案

时间:2019-06-25 14:20:11

标签: c# azure asp.net-core .net-core jwt

所以,这困扰了我一段时间。我已经采取了变通方法以使其正常工作,但我真的很想知道这是否可行...

我有一个.NET Core 2.2 MVC App,其中包含一些API控制器以及常规的MVC控制器和视图。

最终目标是拥有一个Azure Function应用程序来针对API端点运行计划的任务,并使用户能够登录和使用该应用程序。阅读受管服务身份表明,我可以使用服务凭据来使功能应用程序向API控制器进行身份验证,因此我们不必在功能应用程序中保存用户凭据。

用户通过我们的Azure AD登录,此部分工作正常。我还希望使用JWT(Authorize: Bearer ....

对API端点/控制器进行身份验证。

我似乎能够配置Azure AD身份验证或JWT身份验证,但不能同时配置。关于如何实现这一目标的任何想法?

这是Startup.cs配置身份验证的一部分:

public void ConfigureServices(IServiceCollection services)
{
    // ... just some non interesting bits removed

    services.AddAuthentication(config =>
        {
            config.DefaultAuthenticateScheme = AzureADDefaults.AuthenticationScheme;
            config.DefaultChallengeScheme = AzureADDefaults.AuthenticationScheme;
            config.DefaultAuthenticateScheme = AzureADDefaults.AuthenticationScheme;
            config.DefaultSignInScheme = AzureADDefaults.AuthenticationScheme;
        })
        .AddAzureAD(options => Configuration.Bind("AzureAd", options))
        .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));

    services.AddMvc(config =>
        {
            var policy = new AuthorizationPolicyBuilder(new[]
                {
                    AzureADDefaults.AuthenticationScheme,
                    AzureADDefaults.JwtBearerAuthenticationScheme
                })
                .RequireAuthenticatedUser()
                .Build();
            config.Filters.Add(new AuthorizeFilter(policy));
        })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

已启用JWT的控制器均装饰有Authorize属性(不确定是否需要此属性,但似乎是这样)

[Authorize(AuthenticationSchemes = "AzureADJwtBearer")]

这使我知道两种方案都可以正常工作,但是在未通过身份验证时,没有重定向到Azure AD登录,这意味着...他们无法登录。 Location标头已发送,但响应代码为401: Unauthorized,因此浏览器将忽略它。

0 个答案:

没有答案