OpenID连接授权代码流和具有静默刷新的PKCE

问题描述 投票:1回答:1

我通过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*/}

Angular注销方法

async logout() {
        this.manager.signoutRedirect()
            .catch((error) => {
            });
        this.manager.signoutRedirectCallback()
            .then(() => {
                this.manager.removeUser();
            })
            .then(() => {
                this.user = null;
            })
            .catch((error) => {
            });
    }

Angular 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

尽管我使用了无声刷新来避免在不限时间的情况下使持证人令牌被盗以及一个坏男孩在我的API上做坏事。通过我的实施,坏男孩可以使用我的API来达到永恒。

我的问题:

  • 是否应该发生?
  • access_token是否被授予终身?
  • 如果不是我做错了什么?
  • 通过AccessTokenLifetime后,如何拒绝使用访问令牌?或在用户注销后。

NB:我禁用了所有缓存。

oauth-2.0 openid identityserver4 openid-connect
1个回答
0
投票

我虽然使用了无声刷新来避免持有者令牌被盗和一个坏男孩在我的API上无限制地做坏事时间。通过我的实施,坏孩子可以玩我的API永恒。

我的问题:

是否应该发生?

静默刷新为not,以避免承载令牌被盗。由于基于javascript客户端的公共客户端的性质,您的access_token总是有机会被公开。此处有无提示刷新功能,因此,如果用户可以使用PKCE之类的功能进行刷新,则可以无提示地完成此操作而不会打扰用户。

也删除PersistedGrants对Code + PKCE客户端没有任何影响,因为它们不使用刷新令牌(这就是PKCE的目的)。

access_token是否被授予终身?

访问令牌基于由AccessTokenLifetime确定的过期时间有效。但是,如果您使用的是带有静默刷新的PKCE,则可以像我提到的那样更新它们。

如果不是我做错了什么?我如何拒绝使用访问权限传递AccessTokenLifetime之后的令牌?或在用户注销后。

要清楚,访问令牌的生存期是确定的[[发布令牌时],因此,如果您更改AccessTokenLifetime的值after,这将是新令牌不存在的令牌的持续时间。 access_token jwt过期后,令牌将自动失效。

© www.soinside.com 2019 - 2024. All rights reserved.