根据客户端自定义登录页面

时间:2017-12-13 14:01:07

标签: identityserver4

我想让登录页面知道哪个客户端请求登录以显示某些特定于客户端的品牌:否则用户可能会对为什么将其重定向到其他域上的此外部登录页面感到困惑。客户徽标将有助于向他保证他仍然在正确的轨道上。

获取该信息的最合理方法是什么?

编辑:请注意,“客户端”我指的是代表其发生身份验证的客户端Web应用程序 - 而不是用户的浏览器。所有客户都在我的控制之下,因此我只使用隐式工作流程。

为了使这一点更加清晰:我有客户端网络应用程序A和B,以及身份服务器I.当用户代表B来到我时,B徽标应该出现,因为我们不再在B的域中如果没有至少展示与B相关的品牌,这可能会令人困惑。

1 个答案:

答案 0 :(得分:5)

一些理论

ClientId获取IdSrv 4的最简单方法是通过名为IIdentityServerInteractionService的服务,该服务在帐户控制器中用于获取AuthorizationContext。然后使用IClientStore服务进行跟进,该服务允许您获取ClientId给出的客户详细信息。获得这些详细信息之后,只需将该信息发送到视图以进行布局。 IdSrv 4中的客户端模型具有LogoUri属性,您可以使用该属性在每个客户端登录时显示图像。

简单示例

    // GET: /Account/Login
    [HttpGet]
    [AllowAnonymous]
    public async Task<IActionResult> Login(string returnUrl = null)
    {
        var context = await _interaction.GetAuthorizationContextAsync(returnUrl);

        if (context?.IdP != null)
            // if IdP is passed, then bypass showing the login screen
            return ExternalLogin(context.IdP, returnUrl);

        if(context != null)
        {
            var currentClient = await _clientStore.FindClientByIdAsync(context.ClientId);

            if (currentClient != null)
            {
                ViewData["ClientName"] = currentClient.ClientName;
                ViewData["LogoUri"] = currentClient.LogoUri;
            }
        }

        ViewData["ReturnUrl"] = returnUrl;
        return View();
    }