c# - 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 }
);
}
}
对此的任何帮助将不胜感激,谢谢!
解决方案
推荐阅读
- javascript - Regex Pattern for Matching Single Lines of Text/Chars
- python - 每次调用父函数时,如何从排序字典中调用函数?
- javascript - 使用 vue 过滤表行
- reactjs - 使用 React Router 的代理 API 请求
- bash - 使用 wc 查找文件名的最长长度并分配变量
- web-applications - 如何在 kubeadm 集群上公开 Web 应用程序?
- html - 如何定位页脚以隐藏在所有内容下,如下所示?
- go - golang struct default value using bson
- sql-server-2008 - 为缺失的数据库值填充静态值
- python - 读取 Excel 文件时将 pandas MultiIndex 协调为字符串