我无法使用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标头中添加或不添加自动化,我收到“Unauthorized Exception - 401”
我已经检查了其他 Stack 帖子和 GitHub 帖子,看来我的配置还可以。
如果需要,我可以添加配置文件。
感谢。
修改1:
这里是邮递员头部的屏幕:
答案 0 :(得分:25)
我不确定您是否面临同样的问题,但我正在运行一个ASP.NET核心项目,其代码与您的类似。
我在API登录时提供的持票人令牌时遇到了401
个回复,但通过在app.UseAuthentication()
中调用Configure()
作为第一个方法来解决这个问题。 。我的代码改变了......
app.UseMvc();
app.UseAuthentication();
对此...
app.UseAuthentication();
app.UseMvc();
答案 1 :(得分:4)
您的代码看起来不错。问题的最根本原因是您尚未向应用程序添加身份验证中间件。 AddAuthentication
的{{1}}扩展调用仅注册所有必需的服务,但它不会将身份验证中间件添加到HTTP请求管道。
要解决此问题,请在IServiceCollection
方法中添加以下调用:
Startup.Configure()
我能够使用您的代码重现问题,并且调用public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseAuthentication();
// ...
}
可以解决问题。