我正在使用asp.net核心身份的idetityServer。问题是我希望用户在注册后确认他的电子邮件。为了实现我使用ASP.NET Core网站指南的指南,因此这几乎是标准的。
因此,用户收到带有链接的电子邮件,该链接指向ItentityServer。用户单击链接IdentityServer后,验证令牌,最终确定注册并要求用户登录。在此处,在登录之后,用户被重定向到实际网站,在此遇到错误。
据我了解,带有OIDC中间件的网站期望来自IdentityServer的特殊相关cookie,这显然是从答复中错过的,因为它最初来自确认电子邮件。
也许有人面对这种情况?
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
中定义您的验证方案外,与Auth的最低限度参与将是您的控制器或处理程序上的[Authorize]
属性,但是只要有一点额外的数据,您 can can can 将验证留给身份证服务器。
我实际上在正在从事的项目上做同样的事情。首先,我使客户端应用显示单个链接读取Register or Login
。这样,用户启动OIDC流到身份服务器的逻辑是合乎逻辑的,无论他们是否有帐户。
您要在OIDC登录流程的上下文中要注册的原因是Identity Server旨在为许多客户端服务。当您的用户通过单击电子邮件中的验证链接开始新的会话时,新会话需要知道在成功验证后与哪个客户联系。身份服务器通常依赖的OIDC上下文根本不存在,所以这就是您需要解决的问题。
因此,在已知客户端的OIDC流量的上下文中注册,同时您会生成电子邮件验证令牌,还将重定向的URL存储为指向[Authorize]
受保护的URL的REDIRECT在客户端上。将URL与新验证令牌一起存放到数据库中。(对于完全"干净"的实现,您可以将其添加到ClientStore
Identity Server Client
的Properties
字典中,并通过注入该和IdentityServerInteractionService
在运行时查找它。有一个很好的示例Quickstart UI)。
用户单击链接(新会话)并验证令牌时,将用户发送到较早存储在同一记录中的重定向URL。当用户的浏览器从客户端应用请求页面时,客户端的auth中间件将通过自动启动新的OIDC登录顺序来响应[Authorize]
属性,将用户发送回身份服务器以进行登录。
取决于您如何设置cookie到期,以及在验证时是否允许用户帐户登录,此流程 May 会导致透明的登录(否提出了UI)。但是,如果您使用默认的会话 - 验证cookie,或者登录实际过期或出现了一些其他边缘,则将使用常规的登录请求呈现用户。(通过更多的工作,您可以保证本地帐户的透明登录,但不能为第三方Auth。)