找不到名为“ Bearer”的AuthorizationPolicy

时间:2018-10-07 22:32:45

标签: .net-core jwt

尝试向我的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配置它?

1 个答案:

答案 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中使用此方法。