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

问题描述:

我正在使用IdetityServer和asp.net核心标识。问题是我想让用户在注册后确认他的电子邮件。为了实现我使用asp.net核心网站的指南,所以它非常标准。Asp.net Core 2身份与IdentityServer4和电子邮件确认:关联失败。未找到cookie

所以用户可以接收电子邮件的链接,指向ItentityServer。用户单击链接IdentityServer验证令牌后,最终确定注册并要求用户登录。此处,登录后,用户将重定向到实际网站,并在此处出现错误。

据我了解,网站,OIDC中间件预计从IdentityServer特别相关的cookies这显然是从响应错过,因为它最初从确认邮件来..

也许任何人都面临这样的情况?

warn: Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler[15] 

    '.AspNetCore.Correlation.OpenIdConnect.3jB4rPx9WvoggXG4jjvHMcvub3BxPBU_tQN 
zGyIH9KM' cookie not found. 
info: 
Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler[4] 
    Error from RemoteAuthentication: Correlation failed.. 
fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[0] 
    An unhandled exception has occurred while executing the request 
System.Exception: Correlation failed. 
at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1. 
<HandleR 
equestAsync>d__12.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
at 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNot 
ification(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware. 
<Invoke>d__6. 
MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
at 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNot 
ification(Task task) 
at Microsoft.AspNetCore.SpaServices.Webpack.ConditionalProxyMiddleware. 
<Invoke>d__6.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
at 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNot 
ification(Task task) 
at Microsoft.AspNetCore.SpaServices.Webpack.ConditionalProxyMiddleware. 
<Invoke>d__6.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
at 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNot 
ification(Task task) 
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware. 
<Invoke> 
d__7.MoveNext() 
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2] 
    Request finished in 265.0674ms 500 text/html; charset=utf-8 

改写为最小化客户端应用程序内的依赖关系:

如下所述,OIDC 要求,所述客户端应用程序启动登录流程。除了在Startup.cs定义你的身份验证方案,具有权威性裸最小的参与将是对你的控制器或处理器[Authorize]属性,但有一点额外的数据,你可以离开核查高达身份服务器。

我其实在做一个项目我工作的同样的事情,到一个点。首先,我让客户端应用程序显示一个单链接,链接地址为Register or Login。这样,用户无论是否拥有帐户,都可以启动到Identity Server的OIDC流。

您想要在OIDC登录流的上下文中注册注册的原因是Identity Server旨在为许多客户端提供服务。当您的用户通过单击电子邮件中的验证链接启动新会话时,该新会话需要知道在成功验证后联系哪个客户端。 Identity Server通常依赖的OIDC上下文根本不存在,所以这就是您需要解决的问题。

因此,在来自已知客户端的OIDC流的上下文中进行注册,同时生成电子邮件验证令牌,同时还存储重定向URL,指向客户端上受保护的URL([Authorize])。将URL存储到数据库以及新的验证令牌。 (对于一个完全“干净”的实施,可以将其添加到在ClientStoreProperties字典中的Identity Server Client,并通过注入是与IdentityServerInteractionService看它在运行时,有使用了Identity Server的良好榜样快速入门界面)。

当用户点击链接(新会)和身份验证服务器的令牌,将用户存储在同一个记录前面的重定向URL。当用户的浏览器从您的客户端应用程序请求该页面时,客户端的身份验证中间件将通过自动启动新的OIDC登录顺序来响应[Authorize]属性,并将用户发送回Identity Server进行登录。

根据您设置cookie过期的方式以及您在验证时是否让用户的帐户保持登录状态,此流程可能导致导致透明登录(不显示UI)。但是,如果您使用默认的会话到期Cookie,或者登录实际到期,或者出现其他一些边缘情况,则会向用户提供常规登录请求。 (通过更多的工作,您可以保证本地帐户的透明登录,但不能保证第三方身份验证。)

+1

事实上,OIDC要求登录流太从应用程序启动,因此它知道哪些参数也使用。关联cookie是用来执行此操作的一个机制。 – Tratcher

+0

感谢MCGuireV10。事实上,我希望尽可能保持我的客户端应用程序尽可能地不受干扰。理想情况下,它不知道任何关于登录/注册程序,用户等。我选择的风格是微服务,所以我想有一个服务,处理所有与安全有关的东西.. –

+0

@JanSaladukha,一般Tratcher是正确的,这不仅仅是OIDC协议的工作原理。客户端应用认证API必须启动流程。你可以建立第二个OIDC方案来启动一个“无声”登录尝试,但它确实需要跳过几圈来使其工作。我最近在这里发布了博客(这里是https://mcguirev10.com/2018/01/12/persistent-login-with-identityserver.html)。简短的版本是设置最初的'HttpGet'到你的站点,当它看到一个匿名用户时启动静默流程,这种欺骗客户端认证状态以与IdentityServer同步。 – McGuireV10