Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Login IdentityServer4特定于客户端id的登录页_Login_Asp.net Core_Identityserver4 - Fatal编程技术网

Login IdentityServer4特定于客户端id的登录页

Login IdentityServer4特定于客户端id的登录页,login,asp.net-core,identityserver4,Login,Asp.net Core,Identityserver4,我正在尝试根据客户端id设置不同的登录页面 用例: 我的默认登录页面是典型的用户名/密码类型登录,但对于特定的客户端id,登录页面要求提供3个不同的信息,其中一个是他在邮件中收到的一张纸(由第三方发送)。 一旦我有了这3个信息,我就可以验证并找到相关的用户 技术:到目前为止,我已经做到了,一旦IdentityServer4重定向/连接/授权到它的默认登录路径(/account/login),我就可以根据客户端id重定向到我的第二个登录。它可以工作,但一点也不优雅(感觉有点黑客味)。 我确信有更好

我正在尝试根据客户端id设置不同的登录页面

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

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


有什么想法/建议吗

在最初的
登录
调用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);
    }
//
///显示登录页面
/// 
[HttpGet]
公共异步任务登录(字符串返回URL)
{
//建立一个模型,让我们知道在登录页面上显示什么
var vm=await accountService.BuildLoginViewModelAsync(returnUrl);
//这里有更多的代码
返回视图(vm);
}
在被调用的
accountService.BuildLoginViewModelAsync
中,您有
var context=wait interaction.GetAuthorizationContextAsync(returnUrl)
在这种情况下,您有
clientId
。您可以扩展
LoginViewModel
类以包含一些自定义属性(您自己的),并基于此属性在AccountController中返回不同的视图。然后,您只需要在
视图
文件夹中创建特定视图


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

在最初的
登录
调用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);
    }
//
///显示登录页面
/// 
[HttpGet]
公共异步任务登录(字符串返回URL)
{
//建立一个模型,让我们知道在登录页面上显示什么
var vm=await accountService.BuildLoginViewModelAsync(returnUrl);
//这里有更多的代码
返回视图(vm);
}
在被调用的
accountService.BuildLoginViewModelAsync
中,您有
var context=wait interaction.GetAuthorizationContextAsync(returnUrl)
在这种情况下,您有
clientId
。您可以扩展
LoginViewModel
类以包含一些自定义属性(您自己的),并基于此属性在AccountController中返回不同的视图。然后,您只需要在
视图
文件夹中创建特定视图


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

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

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

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

在AccountController内的BuildLoginViewModelAsync(字符串返回URL)方法中,我执行以下操作:

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

稍后在razor中,我会在任何需要的地方使用@title或@image。

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

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

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

在AccountController内的BuildLoginViewModelAsync(字符串返回URL)方法中,我执行以下操作:

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

稍后在razor中,我会在任何需要的地方使用@title或@image。

是的,这与我之前所做的类似,但我没有扩展和组合不相关的内容,而是创建了一个新的ViewModel,新的View,并重定向到我的其他登录。。。我更喜欢一种方式,使授权重定向到正确的登录,而不是必须在第一个这样做。但是,是的,这个解决方案确实有效。但是它击中了我提到的方法,在击中Authorize调用之前。这是做这件事的地方。这是呈现登录页面的内容。如果您没有实现某些逻辑,它将呈现默认逻辑,如果您进行了一些更改,它将根据您的更改进行呈现。没有第二次重定向等。是的,这类似于我已经进行了,但不是扩展和把无关的东西放在一起,我创建了一个新的视图模型,新的视图,我重定向到我的其他登录。。。我更喜欢一种方式,使授权重定向到正确的登录,而不是必须在第一个这样做。但是,是的,这个解决方案确实有效。但是它击中了我提到的方法,在击中Authorize调用之前。这是做这件事的地方。这是呈现登录页面的内容。如果您没有实现某些逻辑,它将呈现默认逻辑,如果您进行了一些更改,它将根据您的更改进行呈现。没有第二次重定向等。