我目前正在尝试使用承载令牌,无论我做什么,都会收到HTTP 401未经授权的错误。
我在JWT实现上遵循guide,我有一个处理JWT的扩展方法。
public static class AuthenticationExtension
{
public static IServiceCollection AddTokenAuthentication(this IServiceCollection services, IConfiguration config)
{
var secret = config.GetSection("JwtConfig").GetSection("secret").Value;
var key = Encoding.ASCII.GetBytes(secret);
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
x.TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false,
// ValidIssuer = "localhost",
//ValidAudience = "localhost"
};
});
return services;
}
}
此外,以下是令牌控制器生成令牌对象的方法,例如,我应该从标头而不是电子邮件和密码中获取值。
如果在代码中找不到该代码,则将其替换。
var token = jwt.GenerateSecurityToken("fake@email.com");
在我的StartUp.cs
中,我只是简单地将中间件添加到我的配置中。在服务部分,我进行测试
services.AddTokenAuthentication(Configuration);
但是,正如您所见,我收到未经授权的HTTP 401返回。
这是api /令牌控制器中的代码。
[Route("api/[controller]")]
[ApiController]
public class TokenController : ControllerBase
{
private IConfiguration _config;
public TokenController(IConfiguration config)
{
_config = config;
}
[HttpGet]
public string GetRandomToken()
{
var jwt = new JwtService(_config);
var token = jwt.GenerateSecurityToken("fake@email.com");
return token;
}
}
来自api /令牌的令牌
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImZha2VAZW1haWwuY29tIiwibmJmIjoxNTg2NjMzMTkwLCJleHAiOjE1ODY3MTk1OTAsImlhdCI6MTU4NjYzMzE5MH0.SPSErcPpD4f48sWFYQFVUBmTaVtCW8oDw4Np6Tncozo
这是我的appSettings.json
配置,一旦完成此设置,我当然会更改秘密。
这足以保护api,还是应该在api层上使用客户端ID和密码。 HMAC样式。
"JwtConfig": {
"secret": "PDv7DrqznYL6nv7DrqzjnQYO9JxIsWdcjnQYL6nu0f",
"expirationInMinutes": 1440
},