【发布时间】:2022-07-08 00:34:23
【问题描述】:
我正在创建一个 ASP.NET Core Web API。在此,我使用 JWT 令牌进行身份验证。我创建了一个用于测试的演示 SQL 数据库,并且正在使用 Fiddler 测试我的 API。我的Startup 类的ConfigureServices 方法如下所示:
public void ConfigureServices(IServiceCollection services)
{
var authPol = new AuthorizationPolicyBuilder()
.AddAuthenticationSchemes(
new string[] { JwtBearerDefaults.AuthenticationScheme })
.RequireAuthenticatedUser()
.Build();
services.AddControllers(
config =>
{
config.Filters.Add(new AuthorizeFilter(authPol));
}).AddXmlSerializerFormatters()
.AddXmlDataContractSerializerFormatters();
services.AddDbContext<BikeStoresContext>();
// JWT Token
var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("this-is-my-jwt-security-key"));
var tokenValidationParameters = new TokenValidationParameters()
{
IssuerSigningKey = signingKey,
ValidateIssuer = false,
ValidateAudience = true,
ClockSkew = TimeSpan.Zero
};
services.AddAuthentication(x => x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(jwt =>
{
jwt.TokenValidationParameters = tokenValidationParameters;
});
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<BikeStoresContext>()
.AddDefaultTokenProviders();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "BikeStoreAPI", Version = "v1" });
});
}
这是我从 Accounts 控制器的登录操作方法生成 JWT 令牌的代码:
var user = await userManager.FindByEmailAsync(model.UserEmail);
var roles = await userManager.GetRolesAsync(user);
IdentityOptions identityOptions = new IdentityOptions();
var claims = new Claim[]
{
new Claim("Lid", "123456789"),
new Claim(identityOptions.ClaimsIdentity.UserIdClaimType, user.Id),
new Claim(identityOptions.ClaimsIdentity.UserNameClaimType, user.UserName),
new Claim(identityOptions.ClaimsIdentity.RoleClaimType, roles[0]),
new Claim(identityOptions.ClaimsIdentity.EmailClaimType, user.Email)
};
var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("this-is-my-jwt-security-key"));
var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
var jwt = new JwtSecurityToken(claims: claims,
signingCredentials: signingCredentials,
expires: DateTime.Now.AddMinutes(30));
return Ok(new
{
userName = model.UserEmail,
role = roles[0],
token = new JwtSecurityTokenHandler().WriteToken(jwt)
});
生成了 JWT 令牌,但是当我使用 JWT 令牌访问其他 API 时,出现此错误。
WWW-Authenticate: Bearer error="invalid_token", error_description="观众 'empty' 无效"
我不知道我在这段代码中哪里出错了。是否需要更改?
提琴手截图:
【问题讨论】:
标签: api asp.net-core jwt asp.net-core-webapi bearer-token