如何将 Azure AD 和非 Azure AD 令牌添加到同一个 .NET Core Api

Posted

技术标签:

【中文标题】如何将 Azure AD 和非 Azure AD 令牌添加到同一个 .NET Core Api【英文标题】:How I can add both Azure AD and non Azure AD tokens to the same .NET Core Api 【发布时间】:2021-06-20 18:17:53 【问题描述】:

想做这样的事情:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            
                options.TokenValidationParameters = new TokenValidationParameters()
                
                    ValidateAudience = false,
                    ValidateIssuer = false,
                    ValidateIssuerSigningKey = false,
                    ValidateLifetime = true,
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("private_key"))
                ;
            )
            .AddMicrosoftIdentityWebApi(this.Configuration.GetSection("AzureAd"));

但它崩溃了。如果我为每个方案添加一个名称,则 [Authorize] 不起作用。

我怎样才能做这样的事情,并区分不同控制器上的 [Authorize] 方法用于一个或另一个?

谢谢

【问题讨论】:

你的问题解决了吗? 【参考方案1】:

对于 AAD,请在控制器上使用 [Authorize] 对于非 AAD,我使用 [Authorize(AuthenticationSchemes = "Other"]

将“Other”方案名称添加到 .AddJwtBearer 中,如下所示。

编码愉快:)

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer("Other", options =>
            
                options.TokenValidationParameters = new TokenValidationParameters()
                
                    ValidateAudience = false,
                    ValidateIssuer = false,
                    ValidateIssuerSigningKey = false,
                    ValidateLifetime = true,
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("private_key"))
                ;
            )
            .AddMicrosoftIdentityWebApi(this.Configuration.GetSection("AzureAd"))

【讨论】:

【参考方案2】:

仅添加配置策略所需的身份验证是不够的,因此两者都将得到验证(在official doc 中)

  services.AddAuthorization(options =>
    
        var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
            JwtBearerDefaults.AuthenticationScheme,
            "AzureAD");
        defaultAuthorizationPolicyBuilder = 
            defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
        options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
    );

【讨论】:

以上是关于如何将 Azure AD 和非 Azure AD 令牌添加到同一个 .NET Core Api的主要内容,如果未能解决你的问题,请参考以下文章

如何搭建一套Azure AD与ADFS集成身份的环境

如何使用 Postman 获取 Azure AD 刷新令牌?

Azure AD B2C 与企业 (Azure?) AD 帐户集成

Azure AD 与 Azure AD B2C 与 Azure AD B2B

如何使用 Azure AD MSAL 库将角色包含到访问令牌中

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