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

在 Hangfire 中设置 JWT 持有者令牌授权/身份验证

谢骏奇
2023-03-14

如何在 Hangfire 中配置持有者令牌授权/身份验证?

我有一个自定义身份验证过滤器,它读取初始请求的身份验证令牌,但它返回401的所有其他请求(Hangfire调用)。

如何将身份令牌附加到HangFire执行的每个请求的标头中?

令牌过期后如何刷新?

共有1个答案

姬振
2023-03-14

也许有点晚,但这里有一个可能的解决方案。这个想法来自这个帖子:https://discuss.hangfire.io/t/using-bearer-auth-token/2166

基本思想是将你的 jwt 添加为查询参数,然后将其收集在 JwtBearerOptions.Events 中,并将你的 MessageReceivedContext.Token 设置为等于它。这将适用于第一个请求,但随后的请求不会附加查询参数,因此我们需要在获得 jwt 时将 jwt 添加到 cookie 中。所以现在我们在查询参数中检查 jwt。如果我们找到它,然后将其添加到 cookie 中。如果没有,请在饼干中检查它。在“配置服务”中:

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

  })
  .AddJwtBearer((Action<JwtBearerOptions>)(options =>
  {
    options.TokenValidationParameters =
        new TokenValidationParameters
        {
          LifetimeValidator = (before, expires, token, param) =>
                   {
                     return expires > DateTime.UtcNow;
                   },
          IssuerSigningKey = JwtSettings.SecurityKey,
          ValidIssuer = JwtSettings.TOKEN_ISSUER,
          ValidateIssuerSigningKey = true,
          ValidateIssuer = true,
          ValidateAudience = false,
          NameClaimType = GGClaimTypes.NAME
        };

    options.Events = new JwtBearerEvents
    {
      OnMessageReceived = mrCtx =>
      {
        // Look for HangFire stuff
        var path = mrCtx.Request.Path.HasValue ? mrCtx.Request.Path.Value : "";
        var pathBase = mrCtx.Request.PathBase.HasValue ? mrCtx.Request.PathBase.Value : path;
        var isFromHangFire = path.StartsWith(WebsiteConstants.HANG_FIRE_URL) || pathBase.StartsWith(WebsiteConstants.HANG_FIRE_URL);

        //If it's HangFire look for token.
        if (isFromHangFire)
        {
          if (mrCtx.Request.Query.ContainsKey("tkn"))
          {
            //If we find token add it to the response cookies
            mrCtx.Token = mrCtx.Request.Query["tkn"];
            mrCtx.HttpContext.Response.Cookies
            .Append("HangFireCookie",
                mrCtx.Token,
                new CookieOptions()
                {
                  Expires = DateTime.Now.AddMinutes(10)
                });
          }
          else
          {
            //Check if we have a cookie from the previous request.
            var cookies = mrCtx.Request.Cookies;
            if (cookies.ContainsKey("HangFireCookie"))
              mrCtx.Token = cookies["HangFireCookie"];                
          }//Else
        }//If

        return Task.CompletedTask;
      }
    };

  })); 

HangFire 身份验证过滤器:

 public class HangFireAuthorizationFilter : IDashboardAuthorizationFilter
 {

    public bool Authorize(DashboardContext context)
    {
      var httpCtx = context.GetHttpContext();

      // Allow all authenticated users to see the Dashboard.
      return httpCtx.User.Identity.IsAuthenticated;

    }//Authorize

}//Cls
 类似资料:
  • 我正在尝试获取通过角度发送到 php 的授权令牌。我的角度拦截器如下所示 现在如何在php中获取令牌?我试着遵循这个问题的答案。但这也没用。以下是使用上面答案中的代码时的输出。

  • 我在做一个全堆栈的web应用程序。我的前端由angular-cli组成,后端由node+Express构建。

  • 如何在springdoc-openapi-ui(openapi3.0)中启用“authorize”按钮以进行承载令牌身份验证,例如JWT。 必须向Spring和类添加哪些注释?

  • 在我的网络项目中,我想让用户使用用户名/密码和微软帐户登录。技术-堆栈: Asp.网络核心 角 Azure应用服务 首先,我创建了用户名/密码登录。这样地: 启动。反恐精英: 登录方式: 并通过[授权]保护我的api enpoints。到现在为止,一直都还不错。。。这很有效。 现在我想添加一个登录方法与Microsoft帐户。我使用Azure应用服务身份验证/授权(https://docs.mic

  • 我在REST api中使用JWT承载身份验证方案。为了在成功身份验证后将jwt令牌返回给客户端,目前我在正文中使用访问令牌响应,如中所述https://www.rfc-editor.org/rfc/rfc6750#page-10 但是也需要在其他HTTP请求中返回令牌,例如已经存在正文的注册。因此,正在考虑为其使用“身份验证信息”标头。但是承载方案没有在任何地方指定“身份验证信息”标头。我应该使用