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

这只是一个项目,我在其中共享我学到的所有与身份服务器相关的内容。

相关文章