带有静默刷新的OpenID Connect授权代码流和PKCE

时间:2019-07-05 13:38:08

标签: oauth-2.0 openid identityserver4 openid-connect

我在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来达到永恒。

我的问题:

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

注意:我禁用了所有缓存。

1 个答案:

答案 0 :(得分:0)

  

尽管我使用silent-refresh来避免承载令牌被盗   和一个坏男孩在我的API上无限制地做坏事   时间。通过我的实施,坏孩子可以玩我的API   永恒。

     

我的问题:

     

是否应该发生?

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

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

  

access_token是否被授予终身?

访问令牌基于AccessTokenLifetime所确定的有效期限而有效。但是,如果您使用带有静默刷新的PKCE,则可以按照我提到的那样更新它们。

  

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

要清楚,访问令牌的生命周期是颁发令牌时确定的,因此,如果您在之后更改AccessTokenLifetime的值,则该时间将为新令牌的持续时间不存在的令牌。 access_token jwt过期后,令牌将自动失效。