.NET Core Authorize 属性与外部 JWT 身份验证微服务?

Posted

技术标签:

【中文标题】.NET Core Authorize 属性与外部 JWT 身份验证微服务?【英文标题】:.NET Core Authorize attribute with external JWT authentication microservice? 【发布时间】:2016-11-02 10:21:19 【问题描述】:

所以我只是有点难以理解 .NET Core [Authorize] 属性。

我有一个正在运行的身份验证服务(比如说authapi.com),当提供有效的身份验证详细信息时,它将返回一个 JWT。当这个 JWT 被返回给它时,它会验证 JWT 并返回一条消息来表明这一点。

所以,我现在正在构建另一个 WebAPI(比如说genericapi.com),它需要对某些操作/控制器进行授权。想法是,JWT 将在请求的标头中传递给 genericapi,然后需要将它们传递给 authapi.com 以验证它们。

我尝试添加一个策略,但它很快变得令人费解,我不得不在所有内容上写 [Authorize(Policy="TokenValid")],而我宁愿只使用默认的 [Authorize] 这样做,因为所有授权都必须点击 authapi .

我将如何从标头获取 JWT 并将其作为 [Authorize] 的标准行为传递给 authapi

请记住:我不想对 genericapi 上的 JWT 做任何事情,所有身份验证都将由 authapi 处理。

【问题讨论】:

【参考方案1】:

据我了解,您不想在genericapi 中使用JwtBearerAuthentication。在这种情况下,您可以为genericapi 编写自定义身份验证中间件(将 jwt 发送到authapi 并对其进行验证,然后设置当前用户)。然后只需使用[Authorize] 属性。

要编写自定义身份验证中间件,请查看https://***.com/a/37415902/5426333

但是如果可能的话,我不会走你的路。我会将JwtBearerAuthentication 用于genericapi。然后我会使用OnTokenValidated 事件来处理其他验证。

        app.UseJwtBearerAuthentication(new JwtBearerOptions()
        
            Events = new JwtBearerEvents()
            
                OnTokenValidated = (context) =>
                
                    // send jwt to auth api
                    // validate it
                    if (!valid)
                    
                        context.SkipToNextMiddleware();
                    
                    return Task.FromResult(0);
                
            
        );

【讨论】:

实际上,您已经大致了解了我所追求的,我想我误解了 JwtBearerAuthentication 的作用。我现在再试一次看看。【参考方案2】:

您可以尝试自定义默认JwtBearerAuthenticationMiddleware,为其提供自定义ISecurityTokenValidator。您的用户身份将由中间件自动设置,您可以继续在 MVC 中使用 Authorize 属性:

class MyTokenValidator : ISecurityTokenValidator

    public string AuthenticationScheme  get; 

    public MyTokenValidator(string authenticationScheme)
    
        AuthenticationScheme = authenticationScheme;
    

    public bool CanValidateToken => true;

    public int MaximumTokenSizeInBytes
    
        get
        
            throw new NotImplementedException();
        
        set
        
            throw new NotImplementedException();
        
    

    public bool CanReadToken(string securityToken) => true;

    public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
    
        validatedToken = null;

        //your logic here
        var response = GetResponseFromMyAuthServer(securityToken);
        //assuming response will contain info about the user

        if(response == null || response.IsError)
            throw new SecurityTokenException("invalid");

        //create your identity by generating its claims
        var claims = new[]
        
            new Claim(ClaimTypes.NameIdentifier, response.UserId),
            new Claim(ClaimTypes.Email, response.Email),
            new Claim(ClaimsIdentity.DefaultNameClaimType, response.UserName),
        ;

        return new ClaimsPrincipal(new ClaimsIdentity(claims, AuthenticationScheme));
    

在你的创业课上:

var options = new JwtBearerOptions();
options.SecurityTokenValidators.Clear();
options.SecurityTokenValidators.Add(new MyTokenValidator(options.AuthenticationScheme));

app.UseJwtBearerAuthentication(options);

//the rest of your code here
app.UseMvc();

您可能需要进一步完善此方法,但这样您可以通过将所有验证委托给远程端点来实现您的需要。

【讨论】:

以上是关于.NET Core Authorize 属性与外部 JWT 身份验证微服务?的主要内容,如果未能解决你的问题,请参考以下文章

使用 .NET Core 6 中的 [Authorize] 属性重定向到自定义登录页面

ASP.NET Core JWT 身份验证以保护 webAPI [Authorize] 属性错误 401 Unauthorized

在 ASP.NET Core Identity 中使用 Authorize 属性检查多个策略之一

ASP.NET Core Authorize 属性不适用于 JWT

如何创建不依赖于 ASP.NET Core 声明的自定义 Authorize 属性?

Authorize Policy 属性总是返回 403 禁止使用 .net core Identity 和 JwtBearerAuthentication