Asp.net Core 2与IdentityServer4的身份和电子邮件确认:关联失败。找不到cookie

时间:2017-09-23 13:56:16

标签: asp.net asp.net-core asp.net-identity identityserver4

我正在使用带有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
                         });
                });

1 个答案:

答案 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,或者登录实际到期,或者出现一些其他边缘情况,则会向用户显示常规登录请求。 (通过更多工作,您可以保证本地帐户的透明登录,但不能保证第三方身份验证。)