0

我有一个带有ASP.NET Core Identity接口的Identity Server应用程序来管理登录、注册、ecc。

我有一些依赖身份服务器进行身份验证的MVC 应用程序。

一切正常:当我尝试访问受保护的页面时,我被重定向到登录页面,登录后,我被重定向回现在可以访问的受保护页面。

唯一的问题是传递给登录页面的returnUrl类似于

/connect/authorize/callback?client_id=myClientId&redirect_uri=https://localhost:44309/signin-oidc&response_type=code&scope=openid profile email offline_access&code_challenge=yyfbWuF...&x-client-SKU=ID_NETSTANDARD2_0&x-client-ver=5.5.0.0

如果我将此 url 添加到我的注册确认电子邮件链接中,则只有在我启动身份验证请求的同一浏览器中打开该链接时,它才会起作用。

如果确认电子邮件链接在另一个浏览器中打开,它将确认帐户并正确登录,但是,当重定向到客户端时,它将抛出异常:

Exception: Correlation failed.

Unknown location
Exception: An error was encountered while handling the remote login.

Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler<TOptions>.HandleRequestAsync()

这是因为,我猜,新浏览器没有在其他浏览器的身份验证尝试期间生成的 cookie。

所以我的问题是: 有什么方法可以在重定向到登录页面时获取原始受保护的页面 url,以便我可以在确认电子邮件链接中使用它?

这应该足够了,因为一旦帐户被确认,我将被重定向回我的受保护页面,该页面应该向登录页面触发新的身份验证请求,但是,已经登录,这将是一个静默身份验证。

4

1 回答 1

0

“这是因为,我猜,新浏览器没有在其他浏览器进行身份验证期间生成的 cookie。”

这也是我的理解。

解决此问题的一种方法是在客户端优雅地处理错误。如果发生这种类型的错误(关联失败),我们知道身份验证有问题,我们会重定向到客户端的登录页面。(也许,一个不友好的人试图获得访问权限,所以重定向到登录页面。)

就用户在不同浏览器上确认他们的电子邮件而言,我认为重定向到登录页面并让他们登录是合理的。他们注册,确认他们的电子邮件,然后如果它是不同的浏览器,则被要求登录应用程序。

让我知道你是否解决了其他问题!

于 2021-03-03T14:26:58.763 回答