如何将 AzureAD 和 AzureADBearer 添加到 asp.net core 2.2 web api

Posted

技术标签:

【中文标题】如何将 AzureAD 和 AzureADBearer 添加到 asp.net core 2.2 web api【英文标题】:How to add AzureAD AND AzureADBearer to asp.net core 2.2 web api 【发布时间】:2019-09-06 00:16:32 【问题描述】:

我正在尝试创作一个网站,该网站使用 AzureAD 对用户进行身份验证以访问 UI 以创作数据库中的项目。而且我还希望其他服务可以通过不记名令牌调用此 API。

services.AddAuthentication(o => 
                    o.DefaultScheme = AzureADDefaults.BearerAuthenticationScheme;
                    o.DefaultAuthenticateScheme = AzureADDefaults.AuthenticationScheme;
                )
                .AddAzureAD(options => Configuration.Bind("AzureAd", options))
                .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));

我希望使用 AzureAD 方案对用户进行身份验证,但对相同 WEB API(在差异路由下)的服务由承载进行身份验证。或者拥有除两者之外的所有路线。两者都有效

【问题讨论】:

【参考方案1】:

最终通过创建一个策略方案来解决这个问题,该方案根据存在的身份验证标头在两种模式之间切换:

// add azure ad user and service authentication
            services
                .AddAuthentication("Azures")
                .AddPolicyScheme("Azures", "Authorize AzureAd or AzureAdBearer", options =>
                
                    options.ForwardDefaultSelector = context =>
                    
                        var authHeader = context.Request.Headers["Authorization"].FirstOrDefault();
                        if (authHeader?.StartsWith("Bearer") == true)
                        
                            return AzureADDefaults.JwtBearerAuthenticationScheme;
                        

                        return AzureADDefaults.AuthenticationScheme;
                    ;
                )
                .AddAzureADBearer(options => config.Bind("AzureAdBearer", options))
                .AddAzureAD(options => config.Bind("AzureAd", options));

【讨论】:

这有帮助。快速无关的问题,在设置 ForwardDefaultSelector 后,如果 api 请求的非授权标头想要停止重定向到登录页面并返回 401。知道该怎么做吗? @Shubhan 返回 null 而不是 AzureADDefaults.AuthenticationScheme,当 authHeader 为 null 时,应该可以解决问题。 使用 Microsoft.Identity.Web 的新方法是什么?我用什么来代替AddAzureADAddAzureADBearer 调用?【参考方案2】:

您可以将AddAzureADBearer 中间件添加到您的应用程序中:

services.AddAuthentication(sharedOptions =>

    sharedOptions.DefaultChallengeScheme = AzureADDefaults.AuthenticationScheme;
    sharedOptions.DefaultAuthenticateScheme = AzureADDefaults.AuthenticationScheme;
)
.AddAzureAD(options => Configuration.Bind("AzureAd", options))
.AddAzureADBearer(options => Configuration.Bind("AzureAdBearer", options));

假设您的应用程序中有 api 控制器,如果另一个应用程序将访问受 AAD 保护的 web api,您应该设置架构:

[HttpGet]
[Authorize(AuthenticationSchemes = "AzureADBearer")]
public IEnumerable<string> Get()

    return new string[]  "value1", "value2" ;

【讨论】:

我倾向于在身份验证方案配置中使用前向选择器,而不是每次都指定方案。 这最终不起作用 - 为其中一种身份验证方案创建重定向循环并将 API 锁定到一个模式 使用这个给我这个错误::: Bearer error="invalid_token", error_description="签名无效" @Sid ,您是否更正了AddAzureADBearer 选项中的配置 使用 Microsoft.Identity.Web 的新方法是什么?我用什么来代替AddAzureADAddAzureADBearer 调用?

以上是关于如何将 AzureAD 和 AzureADBearer 添加到 asp.net core 2.2 web api的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中验证来自 AzureAD 的 JWT?

IdentityServer3 + AzureAD 和 RedirectUri 混淆

我需要为powerapps配置azureAD吗?

如何在后端 API 中验证 AzureAD accessToken

Azure AD:如何将安全组和应用程序角色都放入访问令牌

带有 Microsoft.Owin.Security.OpenIdConnect 和 AzureAD v 2.0 端点的自定义参数