2015-05-14 76 views
3

正常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任何情况下?

回答

3

随着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(); 
+0

有希望的答案!唯一的事情是'a.com'在服务器端对用户进行身份验证(而不是通过javascript)。有没有办法让令牌在那里?你是否建议让a.com服务器将它的标记写入cookie以供JavaScript拾取? –

+1

是的,服务器'a.com'可以将它存储到一个饼干 – Martin

+0

真棒,但怎么可以'一个。com在认证期间拦截令牌? (我在OWIN中做的) –