首页 文章

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

提问于
浏览
2

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

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

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

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

1 回答

  • 4

    一些理论

    IdSrv 4 获取 ClientId 的最简单方法是通过名为 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();
        }
    

相关问题