完全OpenIDConnect身份验证通过Ajax
问题描述:
正常OpenIDConnect服务器的工作原理是当请求:完全OpenIDConnect身份验证通过Ajax
- 你去
a.com/secure-resource
- 您从服务器
- 您的浏览器处理它,并发送你的得到
302
回身份服务器 - 您在那里登录
- 它通过
POST
012将您送回
- 您在
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客户端样品必须从身份服务器检索令牌的方式,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'可以将它存储到一个饼干 – Martin
真棒,但怎么可以'一个。com在认证期间拦截令牌? (我在OWIN中做的) –