通过 Ajax 请求时完成 OpenIDConnect 身份验证
Posted
技术标签:
【中文标题】通过 Ajax 请求时完成 OpenIDConnect 身份验证【英文标题】:Complete OpenIDConnect auth when requesting via Ajax 【发布时间】:2015-07-25 19:03:45 【问题描述】:正常的 OpenIDConnect 服务器的工作方式如下:
你去a.com/secure-resource
您会从服务器返回 302
您的浏览器会处理它并将您发送到身份服务器
你在那里登录
它通过POST
将您发送回a.com
您登录 a.com
并在浏览器上返回 a.com/secure-resource
。
但是我想解决一个场景,但我需要你的帮助。
用户已登录 idServer 用户登录a.com
用户未登录b.com
我们需要向网络服务器b.com
(来自另一个域a.com
)发送一个ajax调用
b.com
配置为使用 OpenIDConnect。
但是由于对b.com
的请求是通过Ajax,用户不能正常重定向到idServer。 (我们得到的只是302
)
我们可以继续通过 Ajax 处理 302(我仍然不确定这是否可行,安全方面)。
但是
IdentityServer/OpenIDConnect 中是否有针对这些情况设计的方案?
【问题讨论】:
【参考方案1】:在这种情况下,使用 IdentityServer,您设置服务器 b.com
以使用承载令牌身份验证,然后您需要在 Ajax 调用的标头中使用为 a.com 提供的访问令牌
$.ajax(
url: 'http://b.com',
headers:
Authorization: "Bearer " + Your Access Token
)
javascript IdentityServer 客户端示例具有从身份服务器检索令牌的方法,see here
在控制器中,您可以像这样获取用户和令牌
// Get the claims values
var token= (User as ClaimsPrincipal).Claims
.Where(c => c.Type == "access_token")
.Select(c => c.Value).SingleOrDefault();
在你的应用程序的其他部分你可以使用它
//Get the current claims principal
var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
// Get the claims values
var token = identity.Claims.Where(c => c.Type == "accept_token")
.Select(c => c.Value).SingleOrDefault();
【讨论】:
有希望的答案!唯一的事情是a.com
在服务器端对用户进行身份验证(而不是通过 javascript)。有没有办法在那里获得令牌?您是否建议让 a.com 服务器将其令牌写入 cookie 以供 javascript 获取?
是的,服务器 a.com
可以将其存储到 cookie 中
棒极了,但是a.com
如何在认证过程中拦截令牌呢? (我在 OWIN 中做)
我添加了一些代码来展示如何访问声明和令牌
酷!我不知道access_token
只是另一种声明类型!以上是关于通过 Ajax 请求时完成 OpenIDConnect 身份验证的主要内容,如果未能解决你的问题,请参考以下文章
在使用通量架构完成 ajax 请求后更新 reactjs 上下文
ajax 介绍,ajax的请求通过js中的 xmlHttpRequest对象完成
如何检查请求是不是通过 CodeIgniter 中的 AJAX 发出?