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

Posted

技术标签:

【中文标题】OIDC - 登录 URL 查询字符串中的额外参数【英文标题】:OIDC - Extra parameters in sign-in URL query string 【发布时间】:2020-11-13 12:51:52 【问题描述】:

我有一个使用 OIDC 进行身份验证的 javascript 客户端。我正在使用授权代码流。这是一个代码sn-p:

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

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

(C#代码):

// <summary>
/// Entry point into the login workflow
/// </summary>
[HttpGet]
public async Task<IActionResult> Login(string returnUrl)

    ...

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

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

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

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

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

http://MyAuthorizationEndpoint?paramName=paramValue

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

但我无法在 Javascript 客户端中执行此操作,因为我没有明确指定授权端点,仅指定 authority(如 config 对象)。

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

【问题讨论】:

【参考方案1】:

在阅读this讨论后找到了解决方案。方法 Oidc.UserManager.signinRedirect 接受具有此确切用途的 extraQueryParams 参数:

(Javascript 客户端):

mgr.signinRedirect(
        extraQueryParams: 
            device_id: "XYZ"
        ,
    );

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

【讨论】:

以上是关于OIDC - 登录 URL 查询字符串中的额外参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在页面加载时处理辅助bean中的GET查询字符串URL参数?

如何在页面加载时处理支持 bean 中的 GET 查询字符串 URL 参数?

通过删除Laravel中的额外字符,从斜杠分隔的URL中提取参数值

使用来自 Keycloak 的 URL OIDC 参数重定向给出错误请求

Tornado 下一个查询字符串 URL 参数

oidc-client登录后重定向