当前位置: 首页 > 知识库问答 >
问题:

如何使用JWT令牌进行授权

赵嘉纳
2023-03-14

我有一个Web api终端,它给我JWT令牌。它不是一个完全授权的服务器。它只是可以生成一个JWT令牌。

现在我有另一个用 aspnet 核心编写的 Web 应用程序。其中在启动中.cs我添加了以下行,以便我可以使用收到的 JWT 令牌进行授权

            services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

        }).AddJwtBearer(configureOptions =>
        {...});

我也有一个登录表单(在web应用程序中),用户输入用户名和密码,我发送到web api并获得令牌。为了保护web应用程序中的任何控制器,我只使用了[Authorize]属性。

在令牌过期之前,一切正常。令牌的生存期很短,但它确实带有刷新令牌。

我的问题是,我如何检测令牌(来自 web api)现已过期,我需要使用刷新令牌获取一个新令牌。我知道在javascript世界中,我可以拦截http请求并使用刷新令牌更新令牌。

但是我如何在aspnet核心html" target="_blank">客户端应用程序中做到这一点呢??

(注意:我不想使用任何身份验证服务器,如IdtyServer4等)

提前感谢!!

共有1个答案

曾飞雨
2023-03-14

你完全可以实现你想要的:

services
    .AddAuthentication()
    .AddJwtBearer("Firebase", options =>
    {
        options.Authority = "https://securetoken.google.com/my-firebase-project"
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = "my-firebase-project"
            ValidateAudience = true,
            ValidAudience = "my-firebase-project"
            ValidateLifetime = true
        };
    })
    .AddJwtBearer("Custom", options =>
    {
        // Configuration for your custom
        // JWT tokens here
    });

services
    .AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .AddAuthenticationSchemes("Firebase", "Custom")
            .Build();
    });

让我们来看看你的代码和那个代码之间的区别。

AddAuthentication没有参数如果您设置了默认的身份验证方案,那么对于每个请求,身份验证中间件都会尝试运行与默认身份验证方案相关联的身份验证处理程序。既然我们现在有两个可行的身份验证方案,那么运行其中一个是没有意义的。

使用AddJwtBearer的另一个重载每个添加身份验证的AddXXX方法都有几个重载:

一个使用与身份验证方法相关联的默认身份验证方案的地方,如您在这里看到的Cookie身份验证一个除了选项的配置之外,还传递身份验证方案名称的地方,正如在这个重载上一样现在,因为您使用了两次相同的身份验证方法,但是身份验证方案必须是唯一的,你需要使用第二个重载。

更新默认策略由于请求不再自动进行身份验证,在某些操作上添加[Authorize]属性将导致请求被拒绝,并发出HTTP 401。

因为这不是我们想要的,因为我们想给身份验证处理程序一个对请求进行身份验证的机会,所以我们更改了授权系统的默认策略,指出应该尝试Firebase和Custom身份验证方案来对请求进行身份验证。

这并不妨碍你对某些行为有更多的限制;[Authorize]属性具有AuthenticationSchemes属性,该属性允许您覆盖哪些身份验证方案是有效的。

如果您有更复杂的方案,则可以使用基于策略的授权。我发现官方文档很棒。

假设某些操作仅适用于 Firebase 发行的 JWT 令牌,并且必须具有具有特定值的声明;你可以这样做:

services
    .AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .AddAuthenticationSchemes("Firebase", "Custom")
            .Build();

        options.AddPolicy("FirebaseAdministrators", new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .AddAuthenticationSchemes("Firebase")
            .RequireClaim("role", "admin")
            .Build());
    });

然后,您可以在某些操作上使用[授权(策略="Firebase管理员")]

 类似资料:
  • 我是C#新手,我在ASP.NetCore 3.1 MVC网络应用程序中与授权作斗争。我知道谷歌上有很多说明,我已经阅读和观看了3天,但无法解决这个问题,因为我发现的每个说明都使用另一种方式,我真的很困惑。 我的系统的想法是: 步骤 1.我将用户名和密码发布到我的API,它将使用JWT令牌进行响应(如果帐户正确) 步骤2.我解码令牌并获取我的网站的用户名,电子邮件,角色,为另一个请求设置HttpCl

  • 寻求有关如何进行微服务授权的建议。 我使用spring/spring boot来提供所有的微服务 在使用JWT令牌到达实际微服务之前,我可以通过Spring Cloud网关进行身份验证,但是在授权方面,我不确定如何做到这一点。 我想在内部处理business microservice中每个endpoint的授权。 有没有办法将JWT令牌传递给微服务,或者我需要调用authserver来获取用户中的

  • 我们希望使用SpringOAuth2JWT令牌支持。我们的架构如下:Spring只提供了一个REST接口,前端由AngularJS构建,AngularJS查询Spring REST接口。出于授权目的,我们的前端团队希望使用JWT。因此,我查看了SpringOAuth2JWT支持,但仍然不知道如何与前端讨论JWT令牌。在阅读了一些教程后,我实现了以下内容: 我不确定工作流程如何。我猜:前端访问/oa

  • 我正在尝试与URL(python客户端)建立websocket连接,该URL需要传入jwt令牌,服务器(在GO中实现)在上侦听该请求,并应该通过解析令牌进行身份验证。 我试着用这部分代码来提出请求- 此请求命中运行此代码以验证此请求的服务器 func ParseFromRequest(req*http.Request,keyFunc-keyFunc)(令牌*令牌,错误){ } 每次,我都会得到“E

  • 如何确定Authorization: Bearer中使用的JWT令牌...是访问令牌或刷新令牌。换句话说,是什么阻止用户在授权头中使用他的JWT刷新令牌而不是访问令牌。 当我在本指南https://github . com/starkandwayne/ultimate-guide-to-uaa/blob/master/docs/refresh-tokens . MD # jwt-refresh-t

  • 问题内容: 我们的React Native Redux应用程序使用JWT令牌进行身份验证。有许多操作需要此类令牌,​​并且例如在应用加载时会同时分派许多令牌。 例如 双方并要求JWT。我们将令牌保存在和中。我的问题是如何处理令牌到期。 最初,我将使用中间件来处理令牌到期 } 我遇到的问题是,对于令牌和操作,都会刷新令牌,因为在分发令牌和令牌时,令牌将过期。理想情况下,我想“暂停”需要身份验证的操作