如何解决各种设置的 WebAuthn 中继方 ID 主要项目查看器项目代码问题我尝试了什么
我有一个 Angular 11 项目,它实现了 WebAuthn 注册。后端是SpringBoot 2.4
WebAuthn 登录应该在项目的两部分工作,“主”和“查看器” 域设置相当复杂:
主要项目
网址
- 本地:https://localhost:4202
- 暂存:https://company.com(本地 Kubernetes 服务器)
- 产品:https://company-project.com
查看器项目
网址
- 本地:https://localhost:4200
- 暂存:https://viewer.develop.plattform.intra.company.com(本地 Kubernetes 服务器)
- 产品:https://viewer.company-project.com
代码
environment.ts
public static async Task<string> UnloadAsync(Assembly assy,bool silentFail = false)
{
if (AssyLoadContext.__alcd.ContainsKey(assy))
{
var tcs = new taskcompletionsource<string>();
var assemblyName = __namd.Where(kvp => kvp.Value == assy).First().Key;
__alcd[assy].Unloading += alc => tcs.SetResult(assemblyName);
__namd.Remove(assemblyName);
__alcd[assy].Unload();
__alcd.Remove(assy);
Debug.WriteLine($"Unloaded assembly '{assy.GetName().Name}'");
return await tcs.Task;
}
if (silentFail)
{
return null;
}
throw new InvalidOperationException($"Assembly '{assy.GetName().Name}' cannot be unloaded. Did you load it using AssyLoadContext.LoadWithPrivateContext(string assyPath)?");
}
environment.prod.ts(在构建中替换)
prodUrls: ['company-project.com'],webauthn: {
name: "Company DEV",rpId: "localhost"
}
webauthn.service.ts
prodUrls: ['company-project.com'],webauthn: {
name: "Company Prod",rpId: "plattform.intra.company.com" // gets overridden by values in "prodUrls"
}
问题
- 它在本地工作,使用 rpId
private _getRelyingPartyInfo(): RelyingParty { let rpId = environment.webauthn.rpId; /** * Check if the Hostname matches one of our Prod Hostnames * and use this instead */ environment.prodUrls.forEach((url,index) => { if (location.hostname.indexOf(url) > -1) { rpId = environment.prodUrls[index]; } }); const rp = { id: rpId,name: environment.webauthn.name }; return rp; }
(后端和前端都在本地) - 它不适用于登台 --> 后端抛出
WebAuthnException 消息:rpIdHash 与预配置的 rpId 的哈希不匹配。
- 它应该使用
localhost
作为 rpId 在 Prod 上工作(害怕部署,因为它不适用于登台)
我尝试了什么
对于暂存,我将 rpId 更改为 company-project.com
,我可以在“main”中注册和登录。登录“查看器”也会引发错误
规范对什么应该起作用不是很具体:https://www.w3.org/TR/webauthn/#relying-party-identifier,它只说明什么不应该起作用。我认为,多个子域会使登台的事情复杂化吗?
用于登台的正确 rpId 是什么?假设 develop.plattform.intra.company.com
作为 rpId 应该适用于 prod 是否正确?
解决方法
为了登台,我将 rpId 更改为 develop.plattform.intra.company.com,我可以在“main”中注册和登录。登录“查看器”也会引发错误
获取断言的代码是什么?您可能还会遇到this other question。您需要将获取断言 RP ID 设置为与用于注册的 RP ID 相同。如果您不这样做,它将默认为源,对于您的子域将有所不同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。