正常的OpenIDConnect服务器工作方式如下:
- 转到
a.com/secure-resource
- 你得到一个
302
从服务器返回 - 您的浏览器处理它并将您发送到身份服务器
- 你在那里登录
- 它通过
POST
把你送回a.com
- 您登录
a.com
并在浏览器上获得a.com/secure-resource
。
然而我有一个场景,我想解决,但我需要你的帮助。
- 用户已登录idServer
- 用户登录
a.com
- 用户未登录
b.com
- 我们需要发送一个ajax调用到web服务器
b.com
(从另一个域a.com
) -
b.com
配置为使用OpenIDConnect - 但是因为对
b.com
的请求是通过Ajax的,所以用户不能正常重定向到idServer。(我们得到的回应是302
)
我们可以继续通过Ajax处理302(我仍然不确定这是否会工作,安全方面)。
是否有任何场景在IdentityServer/OpenIDConnect是为这些情况设计的?
在这个场景中,您使用IdentityServer设置服务器b.com
以使用承载令牌身份验证,然后您需要在Ajax调用的头中使用为a.com提供的访问令牌
$.ajax({
url: 'http://b.com',
headers: {
Authorization: "Bearer " + Your Access Token
}
})
JavaScript IdentityServer客户端示例有从身份服务器检索令牌的方法,见这里
在控制器中,你可以像这样获取用户和令牌
// 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();