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中提取参数值