OIDC - 登录 URL 查询字符串中的额外参数

Mar*_*uda 7 javascript c# oauth-2.0 openid-connect

我有一个 Javascript 客户端,它使用 OIDC 进行身份验证。我正在使用授权码流程。这是一个代码片段:

var config = {
    authority: "http://localhost:5000",
    client_id: "js",
    redirect_uri: "http://localhost:5003/callback.html",
    response_type: "code",
    scope:"openid profile web_api",
    post_logout_redirect_uri: "http://localhost:5003/index.html"
};
var mgr = new Oidc.UserManager(config);
Run Code Online (Sandbox Code Playgroud)

我希望能够在上面的配置对象中添加额外的参数,这些参数可以在我可以在授权服务器的登录方法中访问的 URL 的查询字符串中使用(http://localhost:5000/Account/登录):

(C# 代码):

// <summary>
/// Entry point into the login workflow
/// </summary>
[HttpGet]
public async Task<IActionResult> Login(string returnUrl)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

(我可以通过returnUrl参数或HttpContext.Request.Query属性访问上面代码中的 URL 查询字符串)

不幸的是,如果我在 Javascript 客户端上的配置对象中设置新的(非标准)参数,它们不会传递到 URL 查询字符串。

上下文化:我需要此功能的原因是因为除了用户名和密码之外,我还必须使用额外的参数来验证用户身份。然而,这些参数并未由用户明确告知。它们的值在客户端 Javascript 代码内分配(例如:客户端的设备 ID(如手机的 IMEI))。如果还有其他更简单的方法来实现这一目标,我很高兴知道。

根据 GitHub 上的讨论,我可以使用 Postman 来实现此目的:

因为在 Postman 中您可以将授权端点 URL 更改为:

http://MyAuthorizationEndpoint?paramName=paramValue

例如:http://localhost:5000/connect/authorize?device_id=XYZ

但我无法在 Javascript 客户端中执行此操作,因为我没有显式指定授权端点,仅指定权限(如上面的配置对象中所示)。

OBS:我不打算使用任何其他类型的授权流程,例如使用扩展授权,因为它更不安全且不推荐。

Mar*_*uda 13

阅读此讨论后找到解决方案。方法 Oidc.UserManager.signinRedirect 接受具有以下确切目的的extraQueryParams参数:

(Javascript 客户端):

mgr.signinRedirect({
        extraQueryParams: {
            device_id: "XYZ"
        },
    });
Run Code Online (Sandbox Code Playgroud)

这对于寻找授权代码流解决方案的任何人都非常有用,在该解决方案中,您需要在发出代码/令牌之前传递自定义参数进行验证。