Search code examples
identityserver4

Login page customized depending on client


I would like to make the login page know which client requested the login in order to display some client-specific branding: Otherwise the user may be confused as to why he's redirected to this foreign login page on a different domain. A client logo will help reassure him that he's still on the right track.

What would be the most reasonable approach to get at that information?

EDIT: Note that by "client" I'm referring to the client web applications on whose behalf the authentication happens - not the user's browser. All clients are under my control and so I'm using only the implicit workflow.

To make this even more clear: I have client web apps A and B, plus the identity server I. When the user comes to I on behalf of B, the B logo should appear as we're no longer on B's domain and that may be confusing without at least showing a B-related branding.


Solution

  • Some Theory

    The easiest way to get the ClientId from IdSrv 4 is through a service called IIdentityServerInteractionService which is used in the Account Controller to get the AuthorizationContext. And then follow that up with the IClientStore service that allows you to get the client details given the ClientId. After you get these details then its only a matter of sending that info to the view for layout. The client model in IdSrv 4 has a LogoUri property that you can utilize to show an image at login per client.

    Simple Example

        // 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();
        }