【问题标题】:How to add AzureAD AND AzureADBearer to asp.net core 2.2 web api如何将 AzureAD 和 AzureADBearer 添加到 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(在差异路由下)的服务由承载进行身份验证。或者拥有除两者之外的所有路线。两者都有效

【问题讨论】:

    标签: c# authentication asp.net-core azure-active-directory asp.net-core-webapi


    【解决方案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 调用?
    猜你喜欢
    • 2020-03-07
    • 2023-02-22
    • 2020-04-18
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2019-11-25
    相关资源
    最近更新 更多