[英]Asp.net core 2 - 401 error with bearer token
我无法使用由 Asp.net Core 生成的令牌授权访问受保护的方法。
配置:
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"]))
};
生成的令牌:
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
};
在一代之后,我得到了这种令牌:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ0ZWl4ZWlyYXBlcnNvQGdtYWlsLmNvbSIsImp0aSI6IjVmNTk3OGVkLWRlZjAtNDM3Yi1hOThhLTg3ZWU4YTQ3MmZlNCIsImV4cCI6MTUxODg2ODYxOCwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIn0.1fHXr8jtuZ8PTJmJPBKQIqiOk_c-bCQ6KRyFLLJkU5s",
"expiration": "2018-02-17T11:56:58.683076Z",
"userFirstName": null,
"userLastName": null
}
我可以在 Postman 的 HTTP 标头中添加或不添加授权,我收到“未经授权的异常 - 401”
我已经检查了其他一些Stack帖子和GitHub帖子,看来我的配置没问题。
如果需要,我可以添加配置文件。
谢谢。
编辑1:
这是 postman 中标题的屏幕:
我不确定您是否面临同样的问题,但我正在运行一个 ASP.NET Core 项目,其代码看起来与您的相似。
在包含 API 登录提供的不记名令牌时,我遇到了401
响应,但这是通过调用app.UseAuthentication()
作为Configure()
的第一个方法来解决的。 我的代码从此更改...
app.UseMvc();
app.UseAuthentication();
对此...
app.UseAuthentication();
app.UseMvc();
你的代码看起来不错。 问题最可能的根本原因是您尚未向应用程序添加身份验证中间件。 IServiceCollection
AddAuthentication
扩展调用只注册所有必需的服务,但它不会向 HTTP 请求管道添加身份验证中间件。
要解决此问题,请在Startup.Configure()
方法中添加以下调用:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseAuthentication();
// ...
}
我能够用您的代码重现该问题,并调用app.UseAuthentication()
解决了该问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.