Asp.net核心2 - 401错误与承载令牌

Orc*_*usZ 12 c# bearer-token asp.net-core

我无法使用Asp.net Core生成的令牌使用Authorized访问受保护的方法.

配置:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(cfg =>
            {
                cfg.RequireHttpsMetadata = false;
                cfg.SaveToken = true;
                cfg.Audience = Configuration["Tokens:Issuer"];
                cfg.ClaimsIssuer = Configuration["Tokens:Issuer"];
                cfg.TokenValidationParameters = new TokenValidationParameters()
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = Configuration["Tokens:Issuer"],
                    ValidAudience = Configuration["Tokens:Issuer"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"]))
                };
Run Code Online (Sandbox Code Playgroud)

生成的令牌:

var claims = new[] {
                new Claim (JwtRegisteredClaimNames.Sub, model.Email),
                new Claim (JwtRegisteredClaimNames.Jti, Guid.NewGuid ().ToString()),
            };

            //_config
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"]));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            var expiration = DateTime.UtcNow.AddDays(7);
            var token = new JwtSecurityToken(_config["Tokens:Issuer"],
                _config["Tokens:Issuer"],
                claims,
                expires: expiration,
                signingCredentials: creds);

            return new TokenModel()
            {
                Token = new JwtSecurityTokenHandler().WriteToken(token),
                Expiration = expiration,
                UserFirstName = model.FirstName,
                UserLastName = model.LastName
            };
Run Code Online (Sandbox Code Playgroud)

一代人之后我得到了这种代币:

{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ0ZWl4ZWlyYXBlcnNvQGdtYWlsLmNvbSIsImp0aSI6IjVmNTk3OGVkLWRlZjAtNDM3Yi1hOThhLTg3ZWU4YTQ3MmZlNCIsImV4cCI6MTUxODg2ODYxOCwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIn0.1fHXr8jtuZ8PTJmJPBKQIqiOk_c-bCQ6KRyFLLJkU5s",
    "expiration": "2018-02-17T11:56:58.683076Z",
    "userFirstName": null,
    "userLastName": null
}
Run Code Online (Sandbox Code Playgroud)

我可以在Postman的HTTP头中添加或不添加自动化,我收到"未经授权的例外 - 401"

我已经检查了一些其他的Stack帖子和GitHub Post,看来我的配置还可以.

如果需要,我可以添加配置文件.

谢谢.

编辑1:

这里邮递员的标题屏幕:

在此输入图像描述

pha*_*raa 29

我不确定你是否面临同样的问题,但我正在运行一个ASP.NET核心项目,其代码看起来与你的类似.

401在包含API登录提供的持有者令牌时遇到了响应,但这是通过调用app.UseAuthentication()作为一种方法来修复的Configure().我的代码改变了......

app.UseMvc();
app.UseAuthentication();
Run Code Online (Sandbox Code Playgroud)

对此......

app.UseAuthentication();
app.UseMvc();
Run Code Online (Sandbox Code Playgroud)

  • 你是救命稻草!我只是失去了几个小时搞清楚为什么它不工作,它只是调用的顺序! (2认同)
  • 如果我能给你 10000 分,我会的。这正是我的问题。 (2认同)

Cod*_*ler 6

您的代码看起来不错。该问题最可能的根本原因是您尚未向应用程序中添加身份验证中间件。AddAuthentication扩展调用IServiceCollection仅注册所有必需的服务,但未将身份验证中间件添加到HTTP请求管道。

要解决此问题,请在Startup.Configure()方法中添加以下调用:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseAuthentication();

    // ...
}
Run Code Online (Sandbox Code Playgroud)

我能够用您的代码重现该问题,并致电app.UseAuthentication()解决该问题。