尝试向我的DotNetCore 2.1 Server和Angular 6 App添加Jwt身份验证。
我已经看过很多关于该主题的文章,而且似乎没有人以同样的方式来做,而且似乎对我也无济于事...我不知道这是怎么回事...
我得到:'找不到名为'Bearer'的AuthorizationPolicy。当我启动服务器时...
服务
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "http://localhost:54523",
ValidAudience = "http://localhost:4300",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("tokensecret))
};
});
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy", builder =>
{
builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials()
.Build();
});
});
services.AddMvc();
配置
app.UseAuthentication();
app.UseCors("CorsPolicy");
app.UseMvc();
控制器
[Authorize()]
[Route("api/[controller]")]
public class ProjectController : Controller
如果我使用Controller [Authorize],则在未验证用户身份时返回/ Account / Login?ReturnUrl = ...
但是它是JWT,它应该只返回401、403 ...
如果我尝试使用[Authorize(JwtBearerDefaults.AuthenticationScheme)],则会收到“未找到名为“ Bearer”的AuthorizationPolicy。”
但是为什么...
编辑
我不知道该行正在更改身份验证的行为,但我也使用此行
serviceCollection.AddIdentity<User, Role>();
怎么了? 我们不能在JWT中使用Identity吗? 如何为JWT配置它?
答案 0 :(得分:1)
好吧,我终于找到了使其正常工作的方法!
您需要使用AddIdentityCore而不是AddIdentity。 然后,您需要自己配置它,并添加未在AddIdentityCore中注册的失踪服务。
链接到AddIdentityCore方法:https://github.com/aspnet/Identity/blob/9b385180a9abcb264507efc23279f083bfc50520/src/Core/IdentityServiceCollectionExtensions.cs
身份注册代码
var builder = serviceCollection.AddIdentityCore<User>(opt =>
{
opt.Password.RequireDigit = true;
opt.Password.RequiredLength = 8;
opt.Password.RequireNonAlphanumeric = true;
opt.Password.RequireUppercase = true;
opt.Password.RequireLowercase = true;
});
builder = new IdentityBuilder(builder.UserType, typeof(Role), builder.Services);
builder.AddEntityFrameworkStores<AmiliaContext>();
builder.AddDefaultTokenProviders();
builder.AddRoleValidator<RoleValidator<Role>>();
builder.AddRoleManager<RoleManager<Role>>();
builder.AddSignInManager<SignInManager<User>>();
serviceCollection.AddDependencies(Assembly.GetExecutingAssembly());
其他说明
用户必须继承IdentityUser 角色必须继承IdentityRole
您不得使用SignInManager中的SignInAsync,而需要使用CheckPasswordSignInAsync。
为什么?
因为SignInAsync内部使用cookie,所以我们无法在JWT中使用此方法。