Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Authentication ASP.NET核心身份验证与JWT:';签名无效';_Authentication_Asp.net Core_Jwt - Fatal编程技术网

Authentication ASP.NET核心身份验证与JWT:';签名无效';

Authentication ASP.NET核心身份验证与JWT:';签名无效';,authentication,asp.net-core,jwt,Authentication,Asp.net Core,Jwt,我想启用基于jwt声明的身份验证。出于某种原因,令牌似乎无效,更具体地说,其签名似乎是问题所在 我尝试在上验证签名,并已成功验证 我的代币是 eyJhbGciOiJIUzUxMiJ9.EYJZWIIJZWIIJZ2VUDCISIMF1DCI6WYJST0XFX0FHRUI5UIL0SIMLZYI6IK1LVZZXIILCJPYXQI1NJA2OTCYMDISIMV4CCI6MTU6MDY0.WDTPFUESRRUDFKO2DRWWWWWWWWWWWWWW5Y7G62PNV4Q3H-deGR3A

我想启用基于jwt声明的身份验证。出于某种原因,令牌似乎无效,更具体地说,其签名似乎是问题所在

我尝试在上验证签名,并已成功验证

我的代币是

eyJhbGciOiJIUzUxMiJ9.EYJZWIIJZWIIJZ2VUDCISIMF1DCI6WYJST0XFX0FHRUI5UIL0SIMLZYI6IK1LVZZXIILCJPYXQI1NJA2OTCYMDISIMV4CCI6MTU6MDY0.WDTPFUESRRUDFKO2DRWWWWWWWWWWWWWW5Y7G62PNV4Q3H-deGR3A

秘密是

9ST5hQe5dUNfAJOQZAtt19uiDhNtKKUt

我的Startup.cs类:

public void ConfigureServices(IServiceCollection services) 
{

            /*...*/

            var key = Encoding.ASCII.GetBytes("9ST5hQe5dUNfAJOQZAtt19uiDhNtKKUt");
            var signingKey = new SymmetricSecurityKey(key);

            // Authenticate a request 
            services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x =>
            {
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = signingKey,
                    ValidateAudience = false,
                    ValidateIssuer = false
                };
            });
            // Custom policy to check if a certain claim has a certain value
            services.AddAuthorization(options =>
            {
                options.AddPolicy(
                    "IsAgentPolicy",
                    policy => policy.RequireClaim("aut", "ROLE_AGENT")
                );
            });

            /*...*/
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseAuthentication();

            app.UseMvc();
        }
我的测试api控制器值controller.cs:

    [Route("api/[controller]")]
    public class ValuesController : ControllerBase
    {
        // GET: api/<controller>
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/<controller>/5
        [HttpGet("{id}")]
        [Authorize("IsAgentPolicy")]
        public string Get(int id)
        {
            return "value";
        }
    }
[路由(“api/[控制器]”)]
公共类值控制器:控制器库
{
//获取:api/
[HttpGet]
公共IEnumerable Get()
{
返回新字符串[]{“value1”,“value2”};
}
//获取api//5
[HttpGet(“{id}”)]
[授权(“保险单”)]
公共字符串Get(int-id)
{
返回“值”;
}
}
我试图点击'localhost:5000/api/values/1'端点(它有一个授权属性),将'Bearer'添加到'authorization'头中,但是我得到了一个响应头

WWW认证→承载错误=“无效令牌”,错误描述=“签名无效”


已解决 似乎这个秘密是Base64URL编码的,需要解码才能用于形成签名密钥


请添加解决方案作为问题的答案。具有相同的问题。我不明白我应该在哪里解码Base64Url代码?从我收集的信息来看,我需要在两个地方使用密钥——生成令牌的地方和配置中间件的地方。两者都通过
IConfiguration
使用appsetttings.json中的值。如果令牌以某种方式进行了编码,则中间件应负责解码。
var key = Base64UrlEncoder.DecodeBytes("YOUR_SECRET");
SymmetricSecurityKey signingKey = new SymmetricSecurityKey(key);