我正在尝试在ASP Net Core 2.1中使用Jwt身份验证和身份
在Startup.cs中,我有:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = AuthOptions.ISSUER,
ValidateAudience = true,
ValidAudience = AuthOptions.AUDIENCE,
ValidateLifetime = true,
IssuerSigningKey = AuthOptions.GetSymmetricSecurityKey(),
ValidateIssuerSigningKey = true,
};
});
var builder = services.AddIdentityCore<User>(options =>
{
// Password settings
...
// Lockout settings
...
// User settings
options.User.RequireUniqueEmail = true;
}).AddEntityFrameworkStores<ApplicationDbContext>();
builder = new IdentityBuilder(builder.UserType,typeof(IdentityRole),builder.Services);
然后在SecurityService.cs中,我尝试使用此语句来获取角色
var roles = await _userManager.GetRolesAsync(user);
及其引发以下异常:
NotSupportedException:存储区未实现IUserRoleStore
Microsoft.AspNetCore.Identity.UserManager.GetUserRoleStore()
我发现它的原因是AddIdentityCore
:如果我使用
AddIdentity<User, IdentityRole>
可以,但是[Authorize]
不起作用
有人遇到过类似的情况吗?为什么会发生这种情况?
答案 0 :(得分:3)
使用AddIdentity<TUser, TRole>
时,该调用将配置默认的身份验证方案,例如(source):
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme;
options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme;
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
})
在Startup.ConfigureServices
中,您具有以下内容,还设置默认的身份验证方案:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
由于定义的顺序(AddIdentity
是之后 AddAuthentication
),默认设置是从Jwt更改为Identity,因此当您使用{{1} },认证过程现在期望使用Identity而不是Jwt。
要解决此问题,最简单的选择是切换[Authorize]
和AddIdentity
的顺序,因此JwtBearer调用排在最后,因此“获胜”。您还需要更加明确,并同时设置AddAuthentication
和DefaultAuthenticateScheme
:
DefaultChallengeScheme
另一种方法是在services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(...);
属性中明确显示,调出要使用的 身份验证方案,例如以下两行之一:
[Authorize]
第一个选项似乎最适合您的用例,但是很高兴知道,随着Identity的发展,第二个选项应该存在(如果有,例如,使用策略)。
>