4

正常的 OpenIDConnect 服务器的工作方式如下:

  • 你去a.com/secure-resource
  • 你得到302服务器的回复
  • 您的浏览器会处理它并将您发送到身份服务器
  • 你在那里登录
  • a.com通过POST
  • 您登录a.coma.com/secure-resource返回浏览器。

但是我有一个我正在尝试解决的场景,但我需要你的帮助。

  • 用户已经在 idServer 上登录
  • 用户已登录a.com
  • 用户未登录b.com
  • 我们需要向 Web 服务器发送一个 ajax 调用b.com(来自另一个域a.com
  • b.com配置为使用 OpenIDConnect。
  • 但是因为请求b.com是通过Ajax,所以用户不能正常重定向到idServer。(我们得到的回应只是一个302

我们可以继续通过 Ajax 处理 302(我仍然不确定这是否可行,安全方面)。

IdentityServer/OpenIDConnect 中是否有针对这些情况设计的方案?

4

1 回答 1

3

在这种情况下,使用 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();
于 2015-05-14T09:01:45.060 回答