未设置DefaultAuthenticateScheme

时间:2019-04-16 05:45:24

标签: c# jwt

我在启动时像这样设置DefaultAuthenticateScheme

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

所以,我应该使用这样的东西:

 [Authorize]
 public IEnumerable<UserViewModel> Get()
 {
    return someData;
 }

但是我不得不编写这段代码

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    public IEnumerable<UserViewModel> Get()
    {
        return somedata;
    }

我用谷歌搜索这个问题,我注意到在启动时使用AddCookie或在AddMVC()之后使用AddAuthentication()时应该会发生,但这不是我的情况。

1 个答案:

答案 0 :(得分:1)

默认情况下,它将使用基于cookie的身份验证方案,直到您明确指定为止。由于Asp .Net Core允许使用AuthenticationSchemes的组合。您需要稍微修改startup.cs才能从Authorize属性中删除AuthenticationSchemes

services
    .AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(cfg =>
    {
        cfg.RequireHttpsMetadata = false;
        cfg.SaveToken = true;
        cfg.Audience = "http://localhost:5111/";
        cfg.TokenValidationParameters = new TokenValidationParameters
        {
            // token config
        };
    });

这行代码cfg.Audience = "http://localhost:5111/";将设置您为该特定受众(主机)设置的默认身份验证方案。

  

但是,[Authorize]属性指定要使用的一种或多种身份验证方案,而不管是否配置了默认值。例如

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

它将为特定的控制器使用指定的AuthenticationSchemes,而不管其默认设置如何。