authentication - 使用多个 ServiceStack 的身份验证提供程序会引发错误
问题描述
我打算使用 2 个 ServiceStack 的身份验证提供程序:一个基于CredentialsAuthProvider
调用remotecreds
的自定义提供程序和内置的JwtAuthProvider
. 我的 AppHost 注册码如下所示
appHost.Plugins.Add(new AuthFeature(() => new UserSession(),
new IAuthProvider[]
{
new JwtAuthProvider(AppSettings)
{
RequireSecureConnection = false,
HashAlgorithm = "RS256",
PublicKeyXml = publicKeyXml,
Audiences = new List<string> { $"{AppSettings.GetDictionary("Auth")["Url"]}/resources" },
PopulateSessionFilter = PopulateSessionFilter
},
new RemoteCredentialsAuthProvider(AppSettings)
{
PopulateSessionFilter = PopulateSessionFilter
},
}));
当我使用自定义身份验证提供程序 ( POST /auth/remotecreds
) 进行身份验证时,尽管身份验证提供程序的代码已正确执行,但 ServiceStack 返回以下错误
{
"responseStatus": {
"errorCode": "NotSupportedException",
"message": "PrivateKey required to use: RS256",
"stackTrace": "[Authenticate: 25/04/2019 9:59:25 AM]:\n[REQUEST: {provider:remotecreds,userName:admin,password:Pa$$word123}]\nSystem.NotSupportedException: PrivateKey required to use: RS256\r\n at ServiceStack.Auth.JwtAuthProvider.GetHashAlgorithm(IRequest req) in C:\\BuildAgent\\work\\3481147c480f4a2f\\src\\ServiceStack\\Auth\\JwtAuthProvider.cs:line 87\r\n at ServiceStack.Auth.JwtAuthProvider.CreateJwtBearerToken(IRequest req, IAuthSession session, IEnumerable`1 roles, IEnumerable`1 perms) in C:\\BuildAgent\\work\\3481147c480f4a2f\\src\\ServiceStack\\Auth\\JwtAuthProvider.cs:line 118\r\n at ServiceStack.Auth.JwtAuthProvider.Execute(AuthFilterContext authContext) in C:\\BuildAgent\\work\\3481147c480f4a2f\\src\\ServiceStack\\Auth\\JwtAuthProvider.cs:line 57\r\n at ServiceStack.Auth.AuthenticateService.Post(Authenticate request) in C:\\BuildAgent\\work\\3481147c480f4a2f\\src\\ServiceStack\\Auth\\AuthenticateService.cs:line 253\r\n at ServiceStack.Host.ServiceRunner`1.ExecuteAsync(IRequest req, Object instance, TRequest requestDto) in C:\\BuildAgent\\work\\3481147c480f4a2f\\src\\ServiceStack\\Host\\ServiceRunner.cs:line 133",
"errors": []
}
}
如果我注释掉JwtAuthProvider
AppHost 中的注册,则上面的相同调用会成功。
所以在这里我很困惑为什么JwtAuthProvider
在我明确地对我的自定义身份验证提供程序进行身份验证时调用 ServiceStack。
解决方案
问题是您JwtAuthProvider
的配置错误,如果您想使用RSA*
哈希算法,则需要使用私钥对其进行配置:
new JwtAuthProvider(AppSettings) {
HashAlgorithm = "RS256",
PrivateKeyXml = AppSettings.GetString("PrivateKeyXml")
}
它仍然会尝试使用您的自定义 AuthProvider 进行身份验证,但如果您已JwtAuthProvider
注册,它将尝试使用 BearerTokenAuthenticateResponse
中的JWT 令牌填充,因此当用户针对您的身份验证提供者进行身份验证时,例如:
var clientnew JsonServiceClient(baseUrl);
var authResponse = client.Post(new Authenticate {
provider = "remotecreds",
UserName = username,
Password = password,
RememberMe = true,
});
他们将有权访问填充在以下位置的 JWT 令牌:
var jwt = authResponse.BearerToken;
因此,如果配置正确,它将返回一个填充的 JWT 令牌,BearerToken
或者如果您删除JwtAuthProvider
它,它不会尝试填充它。
推荐阅读
- python - Tkinter:winfo_reqwith() 返回错误值
- node.js - 为什么使用适用于 JavaScript 的 AWS 开发工具包列出 S3 存储桶文件夹中的对象会返回空的 Contents 数组但 KeyCount 大于 1?
- aws-glue - AWS Glue 自定义分类器
- visual-studio - 在 Visual Studio 2019 中重新打开关闭的选项卡(撤消关闭)?
- flutter - 滚动未来的 ListView
- flutter - 未处理的异常:RangeError(索引):无效值:有效值范围为空:0
- forms - Symfony 完全忽略了重定向和表单的处理
- facebook - Chatfuel 或 Manychat 等聊天机器人平台如何在后端创建 Facebook 应用程序来服务聊天机器人?
- python - 如何以表格格式编写日志记录我希望它们在 python 中按列显示而不使用 pandas
- scala - Scala 泛型类型扩展了 Comparable 接口