代码之家  ›  专栏  ›  技术社区  ›  Carl Quirion

IdentityServer4 client\u id特定的登录页

  •  2
  • Carl Quirion  · 技术社区  · 8 年前

    我正在尝试根据client\u id创建不同的登录页面。

    用例: 我的默认登录页面是经典的用户名/密码类型登录,但对于特定的client\u id,登录页面要求提供3个不同的信息,其中一个是他在邮件中收到的一张纸(由第三方发送)。 一旦我有了这3个信息,我就可以验证并找到关联的用户。

    技术:到目前为止,我已经做到了,一旦IdentityServer4重定向/连接/授权到它的默认登录路径(/帐户/登录),我就会根据client\u id重定向到我的第二个登录。它可以工作,但一点也不优雅(感觉有点黑客味)。 我确信有更好的方法来实现这一点,可能是通过中间件直接从连接/授权重定向到我的第二个登录页面?

    有什么想法/建议吗?

    2 回复  |  直到 8 年前
        1
  •  5
  •   m3n7alsnak3    8 年前

    在最开始的时候 Login 调用IdentityServer,您可以调用:

    /// <summary>
        /// Show login page
        /// </summary>
        [HttpGet]
        public async Task<IActionResult> Login(string returnUrl)
        {
            // build a model so we know what to show on the login page
            var vm = await accountService.BuildLoginViewModelAsync(returnUrl);
    
            // some more code here
    
            return View(vm);
        }
    

    在被调用的 accountService.BuildLoginViewModelAsync ,您有 var context = await interaction.GetAuthorizationContextAsync(returnUrl); 在这种情况下 clientId . 您可以扩展 LoginViewModel 类中包含一些自定义属性(您自己的),并基于此属性在AccountController中返回不同的视图。那么你所需要的就是 Views 用于创建特定视图的文件夹。

    通过这种方式,您可以拥有任意多的视图。

        2
  •  0
  •   Post Impatica    7 年前

    我没有创建硬编码的单独视图,而是简单地使用appsettings。json文件,并为每个clientId指定不同的客户端配置。这样,我可以在将来任何时候有新客户机时轻松编辑文件,而无需重新部署。

    然后,在AccountController登录方法中,我通过将当前clientid与appsettings中的匹配对象相匹配来设置当前LoginViewModel的标题和图像(您必须将标题和图像添加到LoginViewModel类)。json文件。然后设置ViewBag。标题和视图包。返回视图之前的图像。

    有关如何连接appsettings的信息,请参阅我的答案 this SO文章

    在AccountController内的BuildLoginViewModelAsync(string returnUrl)方法中,我执行以下操作:

    if (context?.ClientId != null)
    {
        try
        {
            _customClients.Value.ForEach(x => {
                if (x.Name == context.ClientId)
                {
                    title = x.Title;
                    image = x.Image;
                }
            });
        }
        catch (Exception){}
       ...
    }
    

    以下是我在AccountController中的登录方法:

    [HttpGet]
    public async Task<IActionResult> Login(string returnUrl)
    {
        // build a model so we know what to show on the login page
        var vm = await BuildLoginViewModelAsync(returnUrl);
    
        if (vm.IsExternalLoginOnly)
        {
            // we only have one option for logging in and it's an external provider
            return RedirectToAction("Challenge", "External", new { provider = vm.ExternalLoginScheme, returnUrl });
        }
        ViewBag.Title = vm.Title;
        ViewBag.Image = vm.Image;
        return View(vm);
    }
    

    然后在\u布局中。cshtml我用这个;

    @using IdentityServer4.Extensions
    @{
        string name = null;
        string title = "SomeDefaultTitle";
        string image = "~/somedefaulticon.png";
        if (!true.Equals(ViewData["signed-out"]))
        {
            name = Context.User?.GetDisplayName();
        }
        try
        {
            title = ViewBag.Title;
            image = ViewBag.Image;
        }
        catch (Exception)
        {
        }
    }
    

    后来在《剃刀》中,我在任何需要的地方使用@标题或@图像。