我正在使用带有asp.net核心身份的IdetityServer。问题是我希望用户在注册后确认他的电子邮件。为了实现我使用的asp.net核心网站指南,所以它非常标准。
因此,用户会收到一个指向ItentityServer的链接的电子邮件。用户单击链接后,IdentityServer会验证令牌,最终确定注册并要求用户登录。此时,在登录后,用户被重定向到实际网站,在那里他收到错误。
据我所知,拥有oidc中间件的网站需要来自IdentityServer的特殊关联cookie,这些cookie显然是从响应中遗漏的,因为它最初来自确认电子邮件。
也许有人遇到过这种情况?
let types = ["text/plain", "application/pdf"];
let downloads = health.map(function(version) {
let ext = version.mobileVersion.replace(/.*(?=\.\w+)/, "");
let mimeType = types.filter(function(type) {
return type.indexOf(ext) > -1
});
let data = new Blob([/* Blob data */], {
type: mimeType
});
return $("<a>", {
"class": "sportsDataPlayer",
download: ev.FileName + ext,
type: mimeType,
href: URL.createObjectURL(data),
html: ev.FileName
});
});
答案 0 :(得分:3)
重写以最小化客户端应用程序依赖性:
如下所述,OIDC 要求客户端应用程序启动登录流程。除了在Startup.cs
中定义您的身份验证方案之外,与控制器或处理程序相关的极少数参与auth将属于[Authorize]
属性,但是只需要一点额外数据,就可以将验证交给Identity Server。
我实际上在我正在进行的项目上做同样的事情。首先,我让客户端应用显示一个读取Register or Login
的链接。这样,无论用户是否拥有帐户,用户都可以启动OIDC流到Identity Server,这是合乎逻辑的。
您希望在OIDC登录流的上下文中注册的原因是Identity Server旨在为许多客户端提供服务。当您的用户通过单击电子邮件中的验证链接启动新会话时,该新会话需要知道成功验证后要联系的客户端。 Identity Server通常依赖的OIDC上下文根本不存在,因此您需要解决的问题。
因此,在来自已知客户端的OIDC流的上下文中注册,同时生成电子邮件验证令牌,还会存储指向客户端上受[Authorize]
保护的URL的重定向URL 。将URL与新验证令牌一起存储到数据库。 (对于完全&#34; clean&#34;实现,您可以将其添加到Properties
中的Identity Server Client
的{{1}}字典中,并在运行时通过注入那个和ClientStore
。在Identity Server快速入门UI中有很好的例子。
当用户单击链接(新会话)并且Identity Server验证令牌时,将用户发送到先前存储在同一记录中的重定向URL。当用户的浏览器从您的客户端应用程序请求该页面时,您的客户端的auth中间件将通过自动启动新的OIDC登录序列来响应IdentityServerInteractionService
属性,将用户发送回Identity Server登录。
根据您设置Cookie过期的方式以及您是否让用户的帐户在验证时保持登录状态,此流可能导致透明登录(未显示UI)。但是,如果您使用默认的会话过期cookie,或者登录实际到期,或者出现一些其他边缘情况,则会向用户显示常规登录请求。 (通过更多工作,您可以保证本地帐户的透明登录,但不能保证第三方身份验证。)