尝试在包含以下组件的Web应用程序中实现OpenId连接
身份提供程序和资源服务器是同一个应用程序。
SPA使用Password Flow获取access_token
并存储到cookie中。将access_token
存储到cookie中具有安全线程,但情况不同。
问题
IdP发布的access_token在30分钟后过期,SPA需要更新令牌,而无需再次询问用户凭据。
解决方案
IdP返回刷新令牌以及访问令牌。每当SPA从资源服务器获取401时,它都会向IdP发送刷新令牌,并返回get的新访问令牌。
问题
向SPA发送刷新令牌是一种错误的做法。
单页应用程序(通常实现隐式授权)在任何情况下都不应获取刷新令牌。原因是这条信息的敏感性。您可以将其视为用户凭据,因为刷新令牌允许用户本质上永远保持身份验证。因此,您不能在浏览器中使用此信息,必须将其安全存储。
建议的解决方案
当访问令牌过期时,如果用户的SSO会话尚未过期,则可以使用静默身份验证来检索新令牌,而无需用户交互。
我认为当IdP和资源服务器是同一个应用程序时,静默身份验证不适用于密码流。IdP发布的access_token
只是过期后可用于对资源服务器/IdP进行授权的信息,客户端如何说服IdP发布新的access_token
?(无需发送refresh_token
)
找到angle-oauth2-oidc库,它使用refresh_token
更新access_token
。
在这种情况下,续订access\u token的最佳做法/解决方案是什么?
技术细节
除了之前的回答之外,OAuth工作组最新的SPA指南不再建议使用隐式流。
如果您有简单的共享域应用程序(单个域上的IdP、RS和客户端),那么您应该考虑根本不使用OAuth。来自文档:
OAuth和OpenID Connect在这种部署场景中提供的好处很少,因此建议您重新考虑在这种情况下是否需要OAuth或OpenID Connect。会话身份验证的优点是具有较少的移动部分和较少的攻击向量。OAuth和OpenID Connect主要是为第三方或联合访问API而创建的,因此可能不是同一域场景中的最佳解决方案。
如果您在SPA中使用OIDC/OAuth,他们建议使用PKCE的身份验证代码流。
使用资源所有者密码凭据流会破坏刷新令牌存储参数:SPA现在必须将资源所有者凭据存储在一个安全的地方,而不是无法将刷新令牌存储在一个安全的地方(假设您希望避免频繁向用户请求用户名/密码)。隐式补助金是为SPA设计的,所以最好还是坚持使用它。
单页应用程序不得接收刷新令牌。这已经在OAuth 2.0和OpenID Connect中建立了规则。
我在这里看到的一个好的选择是使用隐式流。这将建立从浏览器到身份提供商的前端通道会话。使用密码授予类型,您可以进行反向通道调用(POST),因此您不会获得此类会话。
通常这是一个cookie,它指向有关以前登录状态的信息(这些是身份提供者的详细信息)。流程完成后,SPA将收到访问令牌
。如您所知,它将过期。但是一旦发生这种情况,SPA可以触发另一个隐式流,但这次使用提示符
查询参数。
提示
ASCII字符串值的空格分隔、区分大小写的列表,用于指定授权服务器是否提示最终用户重新验证和同意。定义的值为:无、登录、同意和选择\u帐户
如果您的身份提供者维护一个长期会话(例如:几个小时或几天),或者如果它维护一个记住我的cookie,SPA可以使用提示=无,使其跳过身份提供者的登录步骤。基本上,您可以通过此获得基于浏览器的SSO行为。
我正在AngularJS SPA中使用资源所有者密码凭证OAuth 2.0流。有几篇文章(这里,这里…)这个问题的答案解释了我们不应该将刷新令牌存储在(web)客户端(LocalStorage)上,而是将它们加密存储在HttpOnly Cookie中,并使用代理API实现对refreh令牌的解密,从而将其转发给安全令牌服务。 大多数文章都暗示我们应该使用一种常见的保护机制来关注CSRF。我想知道单
定义的新集成密钥9xxx7e null 但仍然得到401的回应内容:
我试图解决我的Jetty servlet在HTTPS上运行的问题。 这是浏览器中的错误: 这是卷曲中的错误: 我所做的: > 我创建了密钥库和信任库,如下所述:如何生成密钥库和信任库,以及https://serverfault.com/questions/488003/keytool-subjectalternativename 这是我创建密钥库和信任库的批处理脚本: 我不知道我的情况有什么问题,
我正在尝试理解OpenSSL中使用的x86汇编函数,以使用CPU的RDRAND指令获取随机字节。这是函数体: 我不知道cmp和cmobile指令的用途。我不是x86汇编程序员,但从我看过的参考文献中可以看出,我对它的作用的理解是: 因此,如果rdrand失败,rax只能为0(进位标志是明确的),并且只有当1)rdrand成功(进位设置)并在rax中放入非零数字,或2)ecx中的重试计数器已减为0时
我有一个SPA,用户在ADFS中进行身份验证,应用程序获得访问令牌。我正在尝试使用JS代码来模拟ADAL JS的功能,其中使用一个隐藏的iframe向ADFS请求获取新令牌。 这是 iframe 的 'src' 值: https://../adfs/oauth2/authorize?客户端id=... ADFS配置有两个域:AD和ADLDS(LDAP)。因此,我不确定需要传递哪些值domain_h
概述 SPA是为构建WebApp设计的路由控制和视图转换框架 SPA专注于解决构建WebApp时遇到的共性问题,尤其适用于构建MobileApp, 我们和jQuery Mobile、Sencha Touch等框架不同, 并不是一个构建移动端应用的前端整体解决方案,所以我们不包含UI组件,如果你不想自己设计界面, 可以用Bootstrap、Topcoat等UI Components框架配合SPA,