【发布时间】:2018-07-21 02:10:50
【问题描述】:
我无法使用由 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:
这里是邮递员的标题屏幕:
【问题讨论】:
-
您的授权标头看起来如何?
-
@DotNetDev 图片已添加 :)
-
您确定使用相同的安全算法 (HMACSHA256) 来验证令牌吗?您没有在
.AddJwtBearer选项中指定它,因此它将使用可能不是相同算法的默认值。 -
好的,所以我删除了一些额外的配置,它的工作原理......谢谢伙计们
-
@OrcusZ 没关系,我明白了 :) 只是删除了所有选项并保留了绝对最小值,即 issuersigningkey、validissuer 和 validaudience。
标签: c# asp.net-core bearer-token