将Web api身份验证从.NET Core 1.1迁移到2.0

时间:2017-08-20 03:43:16

标签: authentication asp.net-core firebase-authentication

我正在尝试将旧的身份验证转换为.NET 2.0。我有以下代码:

app.UseJwtBearerAuthentication(new JwtBearerOptions
{
    AutomaticAuthenticate = true,
    IncludeErrorDetails = true,
    Authority = "https://securetoken.google.com/xxxxx",
    TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidIssuer = "https://securetoken.google.com/xxxxxx",
        ValidateAudience = true,
        ValidAudience = "xxxx",
        ValidateLifetime = true,
    },
});

我的新代码如下:

public void Configure(...)
{
    ...
    app.UseAuthentication();
    ...
}

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.RequireHttpsMetadata = false;
            options.IncludeErrorDetails = true;
            options.Authority = "https://securetoken.google.com/xxxxxx";
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidIssuer = "https://securetoken.google.com/xxxxx",
                ValidateAudience = true,
                ValidAudience = "xxxxxx",
                ValidateLifetime = true,
            };
        }); 
    ...
    services.AddMvc();
    services.AddAuthorization(......);
}

但是在2.0中我得到了404响应。如果我从端点中删除[Authorize]属性,则可以正常工作。我的输出窗口显示了这个:

  

Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求   启动HTTP / 1.1 GET http://localhost:62423/api/users/info
  Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:信息:   用户授权失败:(null)。   Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息:   过滤器请求的授权失败   'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'。   Microsoft.AspNetCore.Mvc.ChallengeResult:信息:正在执行   ChallengeResult与身份验证方案()。

     

Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler:信息:   AuthenticationScheme:Identity.Application受到挑战。   Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息:   执行的行动   SORTE.API.ContentManager.Controllers.UsersController.Info   (SORTE.API.ContentManager)在24.0837ms   Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求   完成时间为35.2446ms 302   Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求   启动HTTP / 1.1 GET   http://localhost:62423/Account/Login?ReturnUrl=%2Fapi%2Fusers%2Finfo
  Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求   完成5.8149ms 404

从日志错误中,似乎它正在尝试将我重定向到/Account/Login,但我没有这样的端点,我的项目是一个Web API。

我错过了一些配置吗?

1 个答案:

答案 0 :(得分:3)

我遇到同样的问题,直到我读到this

  

当我们使用Authorize属性时,它实际上默认绑定到第一个身份验证系统。

解决方案是指定使用的方案(JwtBearer):

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Policy = "PoliceName")]

现在我可以获得状态200(带有效令牌)和401(未经授权 - 无效令牌)