1. <small id='E87HV'></small><noframes id='E87HV'>

      <legend id='E87HV'><style id='E87HV'><dir id='E87HV'><q id='E87HV'></q></dir></style></legend>
      1. <tfoot id='E87HV'></tfoot>
        <i id='E87HV'><tr id='E87HV'><dt id='E87HV'><q id='E87HV'><span id='E87HV'><b id='E87HV'><form id='E87HV'><ins id='E87HV'></ins><ul id='E87HV'></ul><sub id='E87HV'></sub></form><legend id='E87HV'></legend><bdo id='E87HV'><pre id='E87HV'><center id='E87HV'></center></pre></bdo></b><th id='E87HV'></th></span></q></dt></tr></i><div id='E87HV'><tfoot id='E87HV'></tfoot><dl id='E87HV'><fieldset id='E87HV'></fieldset></dl></div>

          <bdo id='E87HV'></bdo><ul id='E87HV'></ul>

        无法验证 UseJwtBearerAuthentication 中的令牌.授权被拒

        时间:2023-06-01

          • <i id='pU1qF'><tr id='pU1qF'><dt id='pU1qF'><q id='pU1qF'><span id='pU1qF'><b id='pU1qF'><form id='pU1qF'><ins id='pU1qF'></ins><ul id='pU1qF'></ul><sub id='pU1qF'></sub></form><legend id='pU1qF'></legend><bdo id='pU1qF'><pre id='pU1qF'><center id='pU1qF'></center></pre></bdo></b><th id='pU1qF'></th></span></q></dt></tr></i><div id='pU1qF'><tfoot id='pU1qF'></tfoot><dl id='pU1qF'><fieldset id='pU1qF'></fieldset></dl></div>
              <bdo id='pU1qF'></bdo><ul id='pU1qF'></ul>
              <legend id='pU1qF'><style id='pU1qF'><dir id='pU1qF'><q id='pU1qF'></q></dir></style></legend>

                1. <tfoot id='pU1qF'></tfoot>

                  <small id='pU1qF'></small><noframes id='pU1qF'>

                    <tbody id='pU1qF'></tbody>
                  本文介绍了无法验证 UseJwtBearerAuthentication 中的令牌.授权被拒绝的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  限时送ChatGPT账号..

                  使用单个 asp.net(4.6.1) Web 项目,显然我无法验证在同一服务器上生成的 jwt 令牌.
                  Startup.cs:

                  Using a single asp.net(4.6.1) web project, apparently I'm unable to validate the jwt token that was generated on the same server.
                  Startup.cs:

                          var secret = Encoding.UTF8.GetBytes("12341234123412341234");
                          var jwtFormatter = new CustomJwtFormat("Any", "local", secret);
                  
                          // This part checks the tokens
                          app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
                          {
                              AuthenticationType = DefaultAuthenticationTypes.ExternalBearer,
                              AuthenticationMode = AuthenticationMode.Active, // Block requests
                              AllowedAudiences = new []{"Any"},
                              TokenValidationParameters = new TokenValidationParameters
                              {
                                  IssuerSigningKey = new InMemorySymmetricSecurityKey(secret),
                                  ValidAudience = "Any",
                                  ValidIssuer = "local"
                              }
                          });
                          
                          // This part issues tokens
                          app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
                          {
                              AllowInsecureHttp = false,
                              TokenEndpointPath = new PathString("/auth"),
                              AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
                              Provider = new CustomOAuthProvider(),
                              AccessTokenFormat = jwtFormatter,
                              RefreshTokenFormat = jwtFormatter
                              
                          });
                  
                          app.UseWebApi(config);
                  

                  生成令牌的类看起来像

                  public class CustomJwtFormat : ISecureDataFormat<AuthenticationTicket>
                  {
                      private readonly string _allowedAudience;
                      private readonly string _issuer;
                      private readonly byte[] _jwtTokenSignKey;
                  
                      public CustomJwtFormat(string allowedAudience, string issuer, byte[] jwtTokenSignKey)
                      {
                          _allowedAudience = allowedAudience;
                          _issuer = issuer;
                          _jwtTokenSignKey = jwtTokenSignKey;
                      }
                  
                      public string Protect(AuthenticationTicket data)
                      {
                          if (data == null) throw new ArgumentNullException(nameof(data));
                          
                          var signingCredentials = new SigningCredentials
                          (
                              new InMemorySymmetricSecurityKey(_jwtTokenSignKey),
                              "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256",
                              "http://www.w3.org/2001/04/xmlenc#sha256"
                          );
                  
                          return new JwtSecurityTokenHandler().WriteToken(new JwtSecurityToken(
                              _issuer, 
                              _allowedAudience, 
                              data.Identity.Claims, 
                              DateTime.UtcNow, DateTime.UtcNow.AddMinutes(10), 
                              signingCredentials
                          ));
                          
                      }
                  
                      public AuthenticationTicket Unprotect(string protectedText)
                      {
                          throw new NotImplementedException();
                      }
                  }
                  

                  我从 /auth 收到的令牌看起来有效,并在 jwt.io 上通过调试器(没有标记 base64 进行签名)

                  The tokens I receive from /auth look valid and pass the debugger on jwt.io (without marking base64 for signature)

                  但是 UseJwtBearerAuthentication 拒绝验证令牌.

                  However UseJwtBearerAuthentication refuses to validate the token.

                  这可能是什么原因?

                  此外,我尝试在没有 [Authorize] 的情况下手动验证控制器中的相同令牌,它会完美验证:

                  Moreover, I've tried manually validating the same token in a controller without [Authorize] and it would perfectly validate:

                  <代码>变种T =" eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJpc3MiOiJsb2NhbCIsImF1ZCI6IkFueSIsImV4cCI6MTQ3MjkxMDcwMSwibmJmIjoxNDcyOTEwMTAxfQ.ipSrRSGmje7wfzERsd-M1IDFJnN99AIC4Hs7YX4FIeI英寸;var TokenHandler = new JwtSecurityTokenHandler();;var key = Encoding.UTF8.GetBytes("12341234123412341234");SecurityToken 验证令牌;TokenValidationParameters paras = new TokenValidationParameters(){IssuerSigningKey = new InMemorySymmetricSecurityKey(key),ValidAudience =任何",ValidIssuer =本地"};TokenHandler.ValidateToken(t, paras, out validToken);

                  欧文 3.0.1.0System.IdentityModel.Tokens.Jwt 4.0.3.308261200

                  Owin 3.0.1.0 System.IdentityModel.Tokens.Jwt 4.0.3.308261200

                  推荐答案

                  问题不在于令牌验证,而在于声明没有传递给 Thread.CurrentPrincipal[Authorize] 属性正在读取.

                  The problem wasn't in the token validation, but rather the that the claims were not passed on to Thread.CurrentPrincipal that the [Authorize] attribute was reading from.

                  在 webapi 配置中:

                  config.SuppressDefaultHostAuthentication();
                  config.Filters.Add(new HostAuthenticationFilter(DefaultAuthenticationTypes.ExternalBearer));
                  

                  在启动配置中:

                  app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
                  {
                      AuthenticationType = DefaultAuthenticationTypes.ExternalBearer,
                      ...
                  });
                  
                  app.UseJwtBearerAuthentication1(new JwtBearerAuthenticationOptions()
                  {
                      AuthenticationType = DefaultAuthenticationTypes.ExternalBearer,
                      ..
                  });
                  

                  在 OAuthAuthorizationServerProvider 的 GrantResourceOwnerCredentials 中:
                  使用相同的身份验证类型,您可以从 context.Options

                  var identity = new ClaimsIdentity(youClaimsList, context.Options.AuthenticationType);
                  context.Validated(identity);
                  

                  并确保所有 四个 位置都具有与 AuthenticationType 相同的字符串.如果 HostAuthenticationFilter 将具有不同的 authenticationType 作为输入,它不会将声明从 owin 传递到 webapi.

                  And ensure all four places have the same string as AuthenticationType. If the HostAuthenticationFilter will have a different authenticationType as input, it will not pass on the claims from owin to webapi.

                  这篇关于无法验证 UseJwtBearerAuthentication 中的令牌.授权被拒绝的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:如何从经过身份验证的 SecurityToken 中获取声明 下一篇:DNX Core 5.0 JwtSecurityTokenHandler“IDX10640:不支持算法

                  相关文章

                  最新文章

                    <i id='Q3yGk'><tr id='Q3yGk'><dt id='Q3yGk'><q id='Q3yGk'><span id='Q3yGk'><b id='Q3yGk'><form id='Q3yGk'><ins id='Q3yGk'></ins><ul id='Q3yGk'></ul><sub id='Q3yGk'></sub></form><legend id='Q3yGk'></legend><bdo id='Q3yGk'><pre id='Q3yGk'><center id='Q3yGk'></center></pre></bdo></b><th id='Q3yGk'></th></span></q></dt></tr></i><div id='Q3yGk'><tfoot id='Q3yGk'></tfoot><dl id='Q3yGk'><fieldset id='Q3yGk'></fieldset></dl></div>

                    <small id='Q3yGk'></small><noframes id='Q3yGk'>

                    1. <tfoot id='Q3yGk'></tfoot>
                      <legend id='Q3yGk'><style id='Q3yGk'><dir id='Q3yGk'><q id='Q3yGk'></q></dir></style></legend>
                        <bdo id='Q3yGk'></bdo><ul id='Q3yGk'></ul>