Login IdentityServer4特定于客户端id的登录页
我正在尝试根据客户端id设置不同的登录页面 用例: 我的默认登录页面是典型的用户名/密码类型登录,但对于特定的客户端id,登录页面要求提供3个不同的信息,其中一个是他在邮件中收到的一张纸(由第三方发送)。 一旦我有了这3个信息,我就可以验证并找到相关的用户 技术:到目前为止,我已经做到了,一旦IdentityServer4重定向/连接/授权到它的默认登录路径(/account/login),我就可以根据客户端id重定向到我的第二个登录。它可以工作,但一点也不优雅(感觉有点黑客味)。 我确信有更好的方法来实现这一点,可能是通过一个中间件,直接从连接/授权重定向到我的第二个登录页面Login IdentityServer4特定于客户端id的登录页,login,asp.net-core,identityserver4,Login,Asp.net Core,Identityserver4,我正在尝试根据客户端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调用之前。这是做这件事的地方。这是呈现登录页面的内容。如果您没有实现某些逻辑,它将呈现默认逻辑,如果您进行了一些更改,它将根据您的更改进行呈现。没有第二次重定向等。