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



我们已经发现,通过浏览OIDC客户端(https://oidcclienturl.com/)的直接URL,我们的用户经常第一次访问我们的Web应用程序。NET CORE OIDC身份验证中间件启动,用户将重定向到IdentityServer 4登录页面。

一切正常,但随后他们决定添加(临时?状态,nonce,cookie ...)授权URL作为浏览器中的书签,然后进入其凭据并继续返回Web应用程序。

当用户后来在新会话中使用书签时,这会导致问题。即使用户使用旧授权URL,该登录也似乎在输入有效的用户凭据之后实际上可以工作,但是当用户被重定向回到Web应用程序时,它们最终会在空白页面上(https://oidcclienturl.com/signin--cignin--OIDC)。

已加载空白页后,用户可以成功浏览直接URL(https://oidcclienturl.com/),并在Web应用程序中以认证的用户出现。

有什么想法导致空白页?

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

不幸的是,用户在登录页面上书签的现实世界问题无法通过OIDC干净处理,这要求客户端应用程序启动登录流程。

我已经通过在用户数据表中添加RegistrationClientId列来解决此问题,这是与客户端应用程序相对应的IDENSITY SERVER ClientId,该应用程序在创建用户帐户时称为ID。在客户端应用程序配置中,我们使用自定义Properties字典添加URI片段:

new Client
{
    ClientId = "some_client",
    ClientName = "Some Client",
    ClientUri = "https://localhost:5000",
    Properties = new Dictionary<string, string>
    {
        { "StartLoginFragment", "/Auth/StartLogin" }
    }
    // other config omitted
};

当用户登录时,一个空返回URL指示客户端应用程序未调用ID,因此我们使用RegistrationClientId查询IClientStore,然后将ClientUriStartLoginFragment URIS组合起来,并使用结果URI将用户重新定向到客户端应用程序。

在客户端应用程序中,端点启动了OIDC登录流,并且由于用户已经登录ID,因此它可以返回到客户端应用中的正确位置。控制器动作看起来像这样:

[HttpGet]
public async Task StartLogin()
{
    await acctsvc.SignOutAsync();
    await HttpContext.ChallengeAsync("oidc",
        new AuthenticationProperties()
        {
            RedirectUri = "/"
        });
}    

SignOutAsync的呼叫仅确保清理任何客户端应用cookie。它在我们的自定义帐户服务中,但它只是在通常的" cookies"one_answers" OIDC"方案上运行HttpContext.SignOutAsync。通常,这也会导致对IDS的签名,但是随后的ChallengeAsync的重定向替换了已登录的呼叫。

不利的一面是该动作是HTTP GET,这意味着几乎任何人都可以从理论上触发此操作。至多这是一个烦人。

在您的ID仅处理单个客户端的AUTH的特殊情况下,您可以跳过很多 - 如果它们没有返回URL降落在页面上直接在登录之前。

最新更新