使用IdentityServer4中的书签授权URL登录后的空白页

使用IdentityServer4中的书签授权URL登录后的空白页,identityserver4,Identityserver4,我们发现,我们的用户经常第一次通过浏览OIDC客户端()的直接URL访问我们的web应用程序,ASP.NET核心OIDC身份验证中间件启动,用户被重定向回Identityserver 4登录页面 一切正常,但在输入凭证并继续返回web应用程序之前,他们决定在浏览器中添加(临时?状态、nonce、cookies…)授权URL作为书签 这会在用户以后在新会话中使用书签时引发问题。即使用户使用了旧的授权URL,在输入有效的用户凭据后,登录似乎仍能正常工作,但当用户被重定向回web应用程序时,它们最终会

我们发现,我们的用户经常第一次通过浏览OIDC客户端()的直接URL访问我们的web应用程序,ASP.NET核心OIDC身份验证中间件启动,用户被重定向回Identityserver 4登录页面

一切正常,但在输入凭证并继续返回web应用程序之前,他们决定在浏览器中添加(临时?状态、nonce、cookies…)授权URL作为书签

这会在用户以后在新会话中使用书签时引发问题。即使用户使用了旧的授权URL,在输入有效的用户凭据后,登录似乎仍能正常工作,但当用户被重定向回web应用程序时,它们最终会出现在一个空白页()

加载完空白页后,用户可以成功地浏览直接URL(),并作为Web应用程序中的授权用户出现。 什么想法导致了空白页?


如果我理解正确的话,该空白页不应该存在。它是ASP.NET Core中oidc身份验证中间件的默认回调路径。

不幸的是,用户为登录页添加书签的现实问题没有被oidc干净地处理,这需要客户端应用启动登录流

我通过在我的用户数据表中添加一个
RegistrationClientId
列来解决这个问题,该列是Identity Server
ClientId
,对应于创建用户帐户时调用IDS的客户端应用程序。在客户端应用程序配置中,我们使用自定义
Properties
字典添加URI片段:

新客户端
{
ClientId=“一些客户”,
ClientName=“某个客户端”,
ClientUri=”https://localhost:5000",
属性=新字典
{
{“startoginfragment”,“/Auth/startogin”}
}
//省略其他配置
};
当用户登录时,一个空的返回URL表示客户端应用程序没有调用ID,因此我们使用
RegistrationClientId
来查询
IClientStore
,然后将
ClientUri
StartLoginFragment
URI组合起来,并使用生成的URI将用户重定向回客户端应用程序

在客户端应用程序中,该端点启动OIDC登录流,并且由于用户已经在IDS上登录,因此它会返回到客户端应用程序中的正确位置。控制器操作如下所示:

[HttpGet]
公共异步任务STARTOGIN()
{
等待acctsvc.SignOutAsync();
等待HttpContext.ChallengeAsync(“oidc”,
新的AuthenticationProperties()
{
重定向URI=“/”
});
}    
SignOutAsync
的调用只会确保清除所有客户端应用程序登录cookie。它在我们的自定义帐户服务中,但它只是在通常的“Cookies”和“oidc”方案上运行
HttpContext.SignOutAsync
。通常,这也会导致对IDS的注销调用,但随后的
ChallengeAsync
重定向会替换挂起的注销调用

缺点是这个动作是一个
httpget
,这意味着理论上几乎任何人都可以触发这个动作。顶多也会是一种烦恼


在你的ID只处理单个客户端的身份验证的特殊情况下,你可以跳过很多——如果它们在页面上没有返回URL,在它们登录之前,直接将它们发送到你的客户端应用程序开始登录端点。

是否仅在chrome上?不,我可以在safari、firefox和chrome(iOS)上重现这个问题。也在桌面浏览器上。有人描述了同样的问题