OIDC客户端重定向到标识服务器4上的特定登录提供商
这样我就有了一个基本设置。具有3个登录选项的身份服务器。用户名/密码、Google登录和外部登录提供商。就像我现在运行以下代码时一样:
var config = {
authority: "https://example.com",
client_id: "js",
redirect_uri: "https://example.com/callback.html",
response_type: "code",
scope: "openid profile api1",
post_logout_redirect_uri: "https://example.com/index.html",
};
var mgr = new Oidc.UserManager(config);
function login() {
mgr.signinRedirect();
}
我被重定向到以下页面。
当我按LOGIN时,我被重定向到我的登录页面:
这些都很好。但现在我对登录过程有了新的要求。他们希望在Java客户端上有一个特定的登录按钮来启动与Google的登录,并希望有一个特定的按钮来从Java客户端登录到OpenIDConnect登录提供程序。
这样我就可以有一些子页面了。/GoogleIntegrations.html或其他名称。在那里,我希望有一个按钮&试用Google登录,它应该会通过重定向到身份服务器来启动登录到Google,然后立即使Google重定向。
有没有人有类似的用例?
编辑1:
帐户控制器可在此处找到: https://github.com/TopSwagCode/Dotnet.IdentityServer/blob/master/src/IdentityServerAspNetIdentity/Controllers/Account/AccountController.cs编辑2: 我已经尝试了abdusco的解决方案,但我被困在身份服务器上。我不会被重定向回我的Java脚本客户端。
例如:如果我有按钮: Https://localhost:5001/External/Challenge?scheme=OpenIdConnect 我确实会被重定向到外部登录提供商。但当我登录时,我会停留在Identity Server页面上。
我还尝试使用以下链接登录:
https://localhost:5001/External/Challenge?returnurl=/connect/authorize/callback?client_id=js&;redirect_uri=https%3A%2F%2Flocalhost%3A5003%2Fcallback.html&;response_type=code&;scope=openid%20profile%20api1&;scheme=OpenIdConnect
正常流量下的GIF:
编辑3:
使用注释中的以下代码:
var returnUrl = location.href;
var url = "https://localhost:5001/External/Challenge?returnurl=" + returnUrl + "&scheme=OpenIdConnect"
location.href = url;
引发异常。请参见下面的代码截图
编辑4:
我正在调查另一种方法,但仍然没有完全按我想要的方式工作。在身份登录页面上,您可以绕过用户名/密码登录。如果我注释掉该代码,只需重定向到我的OpenIdConnect登录。我可以登录并按我想要的方式重定向到客户端,但这将不允许我使用Google或用户名密码登录。
代码如下所示:
/// <summary>
/// Entry point into the login workflow
/// </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 BuildLoginViewModelAsync(returnUrl);
var context = HttpContext;
//if (vm.IsExternalLoginOnly)
//{
// we only have one option for logging in and it's an external provider
return RedirectToAction("Challenge", "External",
new { scheme = "OpenIdConnect", provider = vm.ExternalLoginScheme, returnUrl });
//}
return View(vm);
}
解决方案
我自己找到了解决方案。
因此,首先我为OpenIDConnect用户创建了一个新的回调URL。例./adminallback.html然后我可以像这样使用OIDC用户管理器脚本:
mgr.signinRedirect({ redirect_uri: 'https://localhost:5003/admincallback.html' });
正常登录按钮只使用默认的/allback.html
这将允许我检查身份后端正在使用什么回调,并根据该回调显示什么登录页面。默认或即时质询外部提供商。如下所示:
/// <summary>
/// Entry point into the login workflow
/// </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 BuildLoginViewModelAsync(returnUrl);
if (returnUrl.Contains("admincallback"))
{
// we only have one option for logging in and it's an external provider
return RedirectToAction("Challenge", "External",
new { scheme = "OpenIdConnect", provider = vm.ExternalLoginScheme, returnUrl });
}
return View(vm);
}
您可以创建包含提供商名称的回调URL,如:/Callback/Google、/Callback/oidc、/Callback/azure等。这将允许您动态决定按下了哪个按钮。而不是为每个受支持的提供程序使用一堆IF语句。
此方法要求您记住将这些新的回调URL添加到数据库。所有代码都可以在以下位置找到:
https://github.com/TopSwagCode/Dotnet.IdentityServer
这只是一个项目,我在其中共享我学到的所有与身份服务器相关的内容。
相关文章