我试图在我的角度SPA中静默地刷新访问令牌。针对ADFS的身份验证已经完成。它工作得很好,配置如下:
oauthService.configure({
redirectUri:
window.location.origin + '/login',
requireHttps: true,
scope: 'openid profile email',
responseType: 'id_token token',
oidc: true,
clientId: environment.adfsClientId,
loginUrl: environment.adfsUrl + '/oauth2/authorize',
issuer: environment.adfsUrl,
logoutUrl:
environment.adfsUrl +
'/ls/?wa=wsignoutcleanup1.0&wreply=' +
location.protocol +
'//' +
location.hostname + '/login',
postLogoutRedirectUri:
window.location.origin + '/login',
});
this.oauthService.tokenValidationHandler = new JwksValidationHandler();
this.oauthService.setStorage(localStorage);
this.oauthService.timeoutFactor = 0.03; // for faster testing
this.oauthService.silentRefreshRedirectUri = window.location.origin + '/search';
this.oauthService.setupAutomaticSilentRefresh();为了刷新令牌,iframe将被添加到当前页面。一切看起来都很好。我将以下代码添加到index.html文件中。
<script>
parent.postMessage(location.hash, location.origin);
</script>此事件是在silentRefreshPostMessageEventListener.中的角OAuth2-oidc.js中捕获的。但问题是我得到的信息是,
MSIS9621:在没有用户输入的情况下无法处理OAuth授权请求。
在iframe中生成的src标记值如下所示,
https://[adfs domain]/adfs/oauth2/authorize/?response_type=id_token%20token&client_id=af0e4d79-ae9d-4fda-86b3-265d1e86a61e&state=UmtkeUJfNDBCUU1VWkZyeWcubFlldlo3ZHFFbFRuVDI3TnNZUU5FVXJxTXpX&redirect_uri=http%3A%2F%2Flocalhost%3A4200%2Fsearch&scope=openid%20profile%20email&nonce=UmtkeUJfNDBCUU1VWkZyeWcubFlldlo3ZHFFbFRuVDI3TnNZUU5FVXJxTXpX&prompt=none
如果我在一个新的选项卡中打开这个URL,我将在Uri中获得一个新的访问令牌。
有人能告诉我我在这里做错了什么吗?
更新
谢谢你加里·阿彻的回答。
我通过在PowerShell中执行这段代码对ADFS进行了更改,
Set-AdfsResponseHeaders“X帧-选项”
什么都没变。然后,我将下面的命令设置为修复该问题。
Set-AdfsResponseHeaders“内容-安全性-策略”“-SetHeaderValue”框架-祖先<源>
发布于 2021-07-06 17:54:26
看起来ADFS阻塞了iframe请求,并发送了一个X帧Oprions=DENY报头。根据这个职位的说法,它在2019年的ADFS中是可解决的。
一个可能有效的选项是使用刷新令牌,但在2021年生产SPA时不建议使用刷新令牌,因为刷新令牌不应该存储在浏览器中的任何地方。
值得记住的是,在2021年,基于沉默的iframe更新也不是真正的建议,因为攻击者可能会利用自己隐藏的iframe并获取令牌。
2021年首选的选项是前端后端方法,其中API处理SPA的令牌更新。
AZURE API驱动方法
进行操作的方法是插入一个API并将其指向Azure AD端点。这将使令牌远离浏览器,在浏览器中只使用SameSite cookie。
以下Curity解决方案演示了这种方法,API可以指向任何授权服务器。不过,这需要一些消化。
https://stackoverflow.com/questions/68274638
复制相似问题