【问题标题】:Different type of authentication for the same controller同一控制器的不同类型的身份验证
【发布时间】:2020-06-04 16:54:56
【问题描述】:

我有 WEB API CORE 3.0 后端应用程序。其控制器受 Azure AD 保护。 为此,我使用 microsoft identity 网络库。

在源代码中我是这样配置的:

        public void ConfigureServices(IServiceCollection services)
        {
            Trace.TraceInformation("Configuring services");
        services.AddProtectedWebApi(Configuration, subscribeToJwtBearerMiddlewareDiagnosticsEvents: true)
            .AddProtectedApiCallsWebApis(Configuration)
            .AddInMemoryTokenCaches();
...

为了保护控制器,我使用 [Authorize]。

一切都很完美。

现在我想添加第二种方式来授权用户(连同 Azure AD)。 我希望用户能够使用 Azure AD 或 JWT 登录。

是否可以为同一个控制器实现它?

【问题讨论】:

  • 身份验证是每个 web 应用程序,而不是控制器。您发布的代码会影响整个应用程序,而不仅仅是单个控制器。 Authorize,顾名思义,影响授权(是否允许已通过身份验证的用户做某事)
  • @PanagiotisKanavos 是的,我知道。 [Authorize] 是让控制器方法只能被授权用户调用。是否可以更改现有的授权机制以允许非 AzureAD 用户使用控制器。我应该从哪里开始?

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


【解决方案1】:

是否可以更改现有的授权机制以允许非 AzureAD 用户使用控制器。

听起来您正在尝试使[Authorize] 同时允许多个身份验证方案。如果是这样的话,你应该先用AddAuthentication().AddMyScheme1().AddMyScheme2()...注册那些认证方案:

services.AddAuthentication()
    .AddAzureAD(options => Configuration.Bind("AzureAd", options));
    .AddJwtBearer(otps=>{
        otps.TokenValidationParameters = new TokenValidationParameters{ ...};
    });

然后更改默认授权策略以同时对这些身份验证方案进行身份验证。例如,如果您想同时允许 Identity/JwtBearer/AzureAd,您可以通过以下方式进行操作

services.AddAuthorization(opts =>{
    opts.DefaultPolicy = new AuthorizationPolicyBuilder()
        .AddAuthenticationSchemes(
            IdentityConstants.ApplicationScheme     // ASP.NET Core Identity Authentication
            ,JwtBearerDefaults.AuthenticationScheme // JwtBearer Authentication
            // ,"AzureAD"                           // AzureAd Authentication
        )
        .RequireAuthenticatedUser()
        .Build();
});

或者,如果您想进一步只允许特定用户/角色,请随意自定义:

opts.DefaultPolicy = new AuthorizationPolicyBuilder()
    .AddAuthenticationSchemes(
        IdentityConstants.ApplicationScheme     // ASP.NET Core Identity Authentication
        ,JwtBearerDefaults.AuthenticationScheme // JwtBearer Authentication
        // ,"AzureAD"                           // AzureAd Authentication
    )
    .RequireAuthenticatedUser()
    .RequireRole(...)
    .RequireAssertion(ctx =>{
        ...
        return true_or_false;
    })
    .Build();

【讨论】:

猜你喜欢
  • 2016-08-13
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 2013-06-17
  • 1970-01-01
  • 2014-08-06
  • 2020-01-25
相关资源
最近更新 更多