代码之家  ›  专栏  ›  技术社区  ›  ovasylenko

Asp核心2.1 Jwt+标识。userManager存储未实现IUserRoleStore

  •  2
  • ovasylenko  · 技术社区  · 6 年前

    我正在尝试在ASP Net Core 2.1中使用Jwt auth和Identity

    在我的启动.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>();
    

    生成器=新标识生成器(生成器.用户类型,类型(IdentityRole),建筑商服务);

    然后在安全服务.cs我试图通过使用这个语句来获得角色

    var roles = await _userManager.GetRolesAsync(user);
    

    并引发以下异常:

    NotSupportedException:存储未实现IUserRoleStore
    Microsoft.AspNetCore.Identity文件.用户管理器.GetUserRoleStore()

    AddIdentityCore :如果我使用 AddIdentity<User, IdentityRole> [Authorize] 不起作用

    有没有人遇到过类似的情况,或者为什么会发生这种情况?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Kirk Larkin    6 年前

    当你使用 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,以便在使用 [Authorize] ,身份验证过程现在希望使用标识,而不是Jwt。

    要解决这个问题,最简单的方法是切换 额外性 添加身份验证 ,因此JwtBearer调用排在最后,因此“获胜”。您还需要更明确地设置两者 DefaultAuthenticateScheme DefaultChallengeScheme :

    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(...);
    

    [授权] 属性,呼叫 要使用的身份验证方案,如以下两行之一:

    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    [Authorize(AuthenticationSchemes = IdentityConstants.ApplicationScheme)]
    

    第一个选项似乎最适合您的用例,但是当您进一步了解身份时,如果您需要第二个选项(还有更多选项,例如使用策略),那么最好知道第二个选项是存在的。