通过 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 发出?

未完成所有请求时,Ext.Ajax.isLoading 返回 false

当另一个完成时执行一个 Ajax 请求

关于ajax请求等待完成