首页 > 解决方案 > UseJwtBearerAuthentication 不使用令牌进行授权.NET

问题描述

我有一个 .NET 4.52 WebAPI v5.2.6 和 OWIN (OAuth & JWT) 4.0.1,我需要根据有效的 JWT 进行授权。JWT 是从外部身份验证服务器生成的。我正在使用我的当前配置Startup.cs来实现这个目标。我肯定使用了正确的 AudienceSecret

        string issuer = ConfigurationManager.AppSettings["Issuer"];
        string audienceId = ConfigurationManager.AppSettings["AudienceId"];
        string audienceSecret = TextEncodings.Base64.Encode(
            Encoding.UTF8.GetBytes(
                ConfigurationManager.AppSettings["AudienceSecret"]
        ));


        uwApp.UseJwtBearerAuthentication(
           new JwtBearerAuthenticationOptions()
           {
               TokenValidationParameters = new TokenValidationParameters()
               {
                   RequireSignedTokens = false,
                   RequireExpirationTime = false,
                   ValidateAudience = false,
                   ValidateLifetime = false,
                   ValidateIssuer = false
               },
               IssuerSecurityKeyProviders = new IIssuerSecurityKeyProvider[]
               {
                    new SymmetricKeyIssuerSecurityKeyProvider(issuer, audienceSecret)
               }
           }
       );

我将此添加到我的 WebApiConfig:config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));但是我无法添加 config.SuppressDefaultHostAuthentication();,因为我的版本中不存在该方法,所以我尝试添加和不添加,但均未config.SuppressHostPrincipal();成功。

我相信我有同样的最终问题

声明不会传递给 [Authorize] 属性正在读取的 Thread.CurrentPrincipal

正如在这个线程中

无法验证 UseJwtBearerAuthentication 中的令牌。授权被拒绝

此外,这在使用 cookie 身份验证来维护会话时工作正常,但它只是没有从中间件中拦截或验证,我不知道如何调试它。我什至在本地切换到 https 以查看是否允许 API 读取承载,但这也不起作用:*(

总而言之,我有一个外部生成的 JWT 和一个验证其完​​整性的密钥。我需要的是从请求中以不记名格式发送的令牌,通过 API 传递它,以便中间件允许我将经过验证的角色和其他声明与 WebAPI 授权属性结合使用。

我已经通过正文而不是标头 Bearer {token} 格式传递令牌来验证签名证书是相同的,然后检查ValidateToken(token)它是有效的,但是我不能使用相同的验证将它与 API 的授权属性一起使用设置。

在此处输入图像描述

这是来自事务的完整请求/响应日志

POST /api/Auth/LoggedIn HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjIyMTIsImVtYWlsIjoiYWRtaW5AaW5maW5pdHktc29mdHdhcmUuY29tIiwidXNlcm5hbWUiOiJLZW4gQ29sc29uIiwiaXNFbXBsb3llZSI6dHJ1ZSwiYWdlbmN5SWQiOjQyMDI4MSwiYWdlbmN5TmFtZSI6IkFDSUMtYWdlbmN5LTI2MyIsInJvbGUiOjMsImV4cCI6IjEyLzEyLzIwMjUifQ.FdW2XRzPFQUSfPieICmjuQ6lyqZSXx1iolCM9OxFppg
User-Agent: PostmanRuntime/7.20.1
Accept: */*
Cache-Control: no-cache
Postman-Token: ea68c533-4d76-4c79-b7d5-cc7dfae28bcb
Host: localhost:44300
Accept-Encoding: gzip, deflate
Content-Length: 0
Connection: keep-alive
HTTP/1.1 401 Unauthorized
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
WWW-Authenticate: Bearer
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcbmljaG9sYXNhXF9fc291cmNlX2NvZGVcdXdtYW51YWxcQUNJQy5VVy5hcGlcYXBpXEF1dGhcTG9nZ2VkSW4=?=
X-Powered-By: ASP.NET
Date: Sat, 30 Nov 2019 20:34:58 GMT
Content-Length: 68
{
"message": "Authorization has been denied for this request."
}

WebAPI 配置

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.EnableCors();
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",

        routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        ); 
 }
}

对此的任何帮助将不胜感激,谢谢!

标签: c#asp.net-web-apijwtauthorizationowin

解决方案


推荐阅读