【问题标题】:UseJwtBearerAuthentication returns 401UseJwtBearerAuthentication 返回 401
【发布时间】:2017-08-05 02:41:46
【问题描述】:

我在我的应用程序堆栈中使用 Firebase 和 dotnet 核心。

我正在使用 Firebase iOS API 生成 JWT 罚款,并且可以使用 jwt.io 的解析器确认该结构符合预期且有效。

设置

我已关注 this article 设置 dotnet core 以根据请求自动设置主体。

我的 Startup 文件的配置方法如下所示,实际上 <project-id> 部分被项目应用程序替换(我可以确认它与我在 jwt 上看到的解析的 JWT 中的 aud 属性相同.io):

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    loggerFactory.AddSerilog();

    app.UseJwtBearerAuthentication(new JwtBearerOptions
    {
        AutomaticAuthenticate = true,
        IncludeErrorDetails = true,
        Authority = "https://securetoken.google.com/<project-id>",
        TokenValidationParameters = new TokenValidationParameters
        {  
            ValidateIssuer = true,
            ValidIssuer = "https://securetoken.google.com/<project-id>",
            ValidateAudience = true,
            ValidAudience = "<project-id>",
            ValidateLifetime = true,
        },
    });

    app.UseMvc();
}

请求

我有一个控制器操作,当我在控制器上没有 Authorize 属性时,我可以点击 url http://localhost:5000/api/dashboard 并获得预期的响应。然后我添加了 Authorize 属性,以便我可以开始测试 JWT 中间件。

我正在 Postman 中创建一个请求,如下图所示:

回应

如上图所示,回复是401 Unauthorized

我的调试输出中的服务器日志如下所示。

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:5000/api/dashboard  
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 GET http://localhost:5000/api/dashboard  
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
      Authorization failed for user: (null).
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:Information: Authorization failed for user: (null).
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
info: Microsoft.AspNetCore.Mvc.ChallengeResult[1]
      Executing ChallengeResult with authentication schemes ().
Microsoft.AspNetCore.Mvc.ChallengeResult:Information: Executing ChallengeResult with authentication schemes ().
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware[12]
      AuthenticationScheme: Bearer was challenged.
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware:Information: AuthenticationScheme: Bearer was challenged.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action Sured.Api.Controllers.DashboardController.Get (Sured.Api) in 20.2369ms
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action Sured.Api.Controllers.DashboardController.Get (Sured.Api) in 20.2369ms
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 37.6488ms 401 

问题

我一直在谷歌上研究并搜索源代码,但我根本无法破解。

谁能看到我在这里做错了什么?

为了更好的衡量,这是我项目中的所有依赖版本:

<PackageReference Include="Microsoft.AspNetCore" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.3" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.2" />
<PackageReference Include="Serilog" Version="2.5.0" />
<PackageReference Include="Serilog.Enrichers.Environment" Version="2.1.2" />
<PackageReference Include="Serilog.Extensions.Logging" Version="1.4.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="2.4.0" />
<PackageReference Include="Serilog.Sinks.ElasticSearch" Version="5.3.0" />
<PackageReference Include="Serilog.Sinks.RollingFile" Version="3.3.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="1.1.2" />

【问题讨论】:

  • 令牌中是否存在有效的声明以允许生成有效的原则?堆栈跟踪似乎无法识别用户。
  • 这有时可能是由于无法验证令牌签名。

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


【解决方案1】:

默认情况下似乎已经添加了密钥。您可能需要将密钥添加到帖子中。
键:Authorization 值:Bearer eyjhbGciOij...
这是在 google API Post 中必须有的,以允许安全连接。 Dashboard 会自动添加这个键。

来源:
以前使用 Google API 的经验

【讨论】:

    【解决方案2】:

    所以...原来它不起作用的可能原因是我一直在玩的令牌已过期。我今天生成了另一个,并再次尝试了邮递员查询,它成功了。

    因此,如果您遇到同样的麻烦,请不要犯我的愚蠢错误,并确保您的令牌尚未过期!

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 2016-08-06
      • 1970-01-01
      • 2018-09-20
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多