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存储到数据库以及新的验证令牌。 (对于一个完全“干净”的实施,可以将其添加到在ClientStore
的Properties
字典中的Identity Server Client
,并通过注入是与IdentityServerInteractionService
看它在运行时,有使用了Identity Server的良好榜样快速入门界面)。
当用户点击链接(新会)和身份验证服务器的令牌,将用户存储在同一个记录前面的重定向URL。当用户的浏览器从您的客户端应用程序请求该页面时,客户端的身份验证中间件将通过自动启动新的OIDC登录顺序来响应[Authorize]
属性,并将用户发送回Identity Server进行登录。
根据您设置cookie过期的方式以及您在验证时是否让用户的帐户保持登录状态,此流程可能导致导致透明登录(不显示UI)。但是,如果您使用默认的会话到期Cookie,或者登录实际到期,或者出现其他一些边缘情况,则会向用户提供常规登录请求。 (通过更多的工作,您可以保证本地帐户的透明登录,但不能保证第三方身份验证。)
事实上,OIDC要求登录流太从应用程序启动,因此它知道哪些参数也使用。关联cookie是用来执行此操作的一个机制。 – Tratcher
感谢MCGuireV10。事实上,我希望尽可能保持我的客户端应用程序尽可能地不受干扰。理想情况下,它不知道任何关于登录/注册程序,用户等。我选择的风格是微服务,所以我想有一个服务,处理所有与安全有关的东西.. –
@JanSaladukha,一般Tratcher是正确的,这不仅仅是OIDC协议的工作原理。客户端应用认证API必须启动流程。你可以建立第二个OIDC方案来启动一个“无声”登录尝试,但它确实需要跳过几圈来使其工作。我最近在这里发布了博客(这里是https://mcguirev10.com/2018/01/12/persistent-login-with-identityserver.html)。简短的版本是设置最初的'HttpGet'到你的站点,当它看到一个匿名用户时启动静默流程,这种欺骗客户端认证状态以与IdentityServer同步。 – McGuireV10