我在IdentityServer 4上以无提示刷新实现了openID Connect授权代码流和PKCE。我有一个引用IdentityServer的核心API,还有一个Angular 8 front和oidc-client.js。
当我不登录时,oidc-client将我从那里重定向到IdentityServer登录页面,然后我可以登录,然后IdentityServer将我重定向到angular应用程序。我有一个Bearer格式的访问令牌,该令牌已传输到API,并且iframe经常弹出并与/ connect / authorize上的IdentityServer联系。注销后,我将重定向到IdentityServer,然后重定向到要求我登录的尖角前端。
在这里,您可能会问这个家伙到底是怎么回事。你去了:
当我在邮递员内部复制/粘贴Bearer令牌时,可以将其永久使用,将AccessTokenLifetime(数据库字段)设置为65,在用户注销后,截断PersistedGrants表之后,执行“ _signInManager.SignOutAsync”后,将其永久使用。 “ _persistedGrantService.RemoveAllGrantsAsync”。
我现在将为您提供一些代码:
Startup.cs API
services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.Authority = configApp.UrlIdentityServer;
options.RequireHttpsMetadata = false;
options.ApiName = "example.api";
});
控制器方法示例:
[HttpGet("{id:int}")]
[Authorize]
public ActionResult<FormatedResult<Stuff>> GetStuff(int id)
{/*great stuff*/}
角度注销方法
async logout() {
this.manager.signoutRedirect()
.catch((error) => {
});
this.manager.signoutRedirectCallback()
.then(() => {
this.manager.removeUser();
})
.then(() => {
this.user = null;
})
.catch((error) => {
});
}
角度oidc管理器设置
authority: 'http://example.authserver.loc/',
client_id: 'example.ng.manager',
redirect_uri: 'http://ng.example.loc:5001/callbacksignin/',
post_logout_redirect_uri: 'http://ng.example.manager.loc:5001/',
response_type: 'code',
scope: 'openid profile example.api',
filterProtocolClaims: true,
loadUserInfo: true,
userStore: new WebStorageStateStore({store: window.localStorage}),
automaticSilentRenew: true,
silent_redirect_uri: 'http://ng.example.manager.loc:5001/silent-refresh.html',
revokeAccessTokenOnSignout: true
尽管我使用silent-refresh来避免在不受限的时间内使持证人令牌被盗以及一个坏男孩在我的API上做坏事。通过我的实施,坏孩子可以使用我的API来达到永恒。
我的问题:
注意:我禁用了所有缓存。
答案 0 :(得分:0)
尽管我使用silent-refresh来避免承载令牌被盗 和一个坏男孩在我的API上无限制地做坏事 时间。通过我的实施,坏孩子可以玩我的API 永恒。
我的问题:
是否应该发生?
不进行静默刷新,以避免承载令牌被盗。由于基于javascript客户端的公共客户端的性质,您的access_token总是有机会被公开。此处有无提示刷新功能,因此,如果用户可以使用PKCE之类的功能进行刷新,则可以无提示地完成此操作而不会打扰用户。
也删除PersistedGrants对Code + PKCE客户端没有任何影响,因为它们不使用刷新令牌(这就是PKCE的目的)。
access_token是否被授予终身?
访问令牌基于AccessTokenLifetime所确定的有效期限而有效。但是,如果您使用带有静默刷新的PKCE,则可以按照我提到的那样更新它们。
如果不是我做错了什么?我如何拒绝使用访问权限 传递AccessTokenLifetime之后的令牌?或在用户注销后。
要清楚,访问令牌的生命周期是颁发令牌时确定的,因此,如果您在之后更改AccessTokenLifetime的值,则该时间将为新令牌的持续时间不存在的令牌。 access_token jwt过期后,令牌将自动失效。