gpt4 book ai didi

asp.net - IdentityServer 3 使用刷新 token 刷新用户

转载 作者:行者123 更新时间:2023-12-04 02:18:41 24 4
gpt4 key购买 nike

我们正在尝试以正确的方式设置 Identity Server 3。
我们的身份验证工作正常,我们设法检索刷新 token 。

客户端应用程序正在使用 Angular。

现在,当 acces_token 过期时,对 rest api 的任何调用都会失败(我们设法让它返回 401),但我们想知道如何重新验证用户。

在我们的测试中,任何从 Javascript 进行的 api 调用都失败了 (401),但是一旦页面刷新,整个机制就会启动。我们确实看到我们被重定向到身份服务器,但它没有显示登录页面,我们显然被发送回带有新 token 的客户端应用程序。

我想做的是刷新访问 token 而不必强制用户刷新页面。

但我不确定是谁的责任?那是客户端应用程序(网站)还是 Angular 应用程序?换句话说,应用程序应该为 Angular 透明地处理这个问题,还是应该在收到 401 时 angular 做一些事情,在这种情况下,我不太确定信息将如何流回网络应用程序。

有什么线索吗?

附加信息:我们正在使用 OpenId Connect

最佳答案

我让它工作了!

正如我在评论中所说,我使用了 this文章。作者引用了 very nice lib我也在使用。

事实:

  • Identity Server 3 在访问 token 刷新时请求客户端 key
  • 不应将 refresh_token 或 client_secret 存储在 javascript 应用程序中,因为它们被认为是不安全的(参见 the article)

  • 所以我选择将refresh_token作为加密cookie发送给这个类(ST BTW发现,只是找不到链接了,对不起......)
    public static class StringEncryptor
    {
    public static string Encrypt(string plaintextValue)
    {
    var plaintextBytes = plaintextValue.Select(c => (byte) c).ToArray();
    var encryptedBytes = MachineKey.Protect(plaintextBytes);
    return Convert.ToBase64String(encryptedBytes);
    }

    public static string Decrypt(string encryptedValue)
    {
    try
    {
    var encryptedBytes = Convert.FromBase64String(encryptedValue);
    var decryptedBytes = MachineKey.Unprotect(encryptedBytes);
    return new string(decryptedBytes.Select(b => (char)b).ToArray());
    }
    catch
    {
    return null;
    }
    }
    }

    javascript 应用程序正在从 cookie 中获取值。然后删除cookie,避免那个东西被一遍又一遍地发送,没有意义。

    当 access_token 无效时,我使用加密的 refresh_token 向应用程序服务器发送 http 请求。那是匿名电话。

    服务器联系身份服务器并获取发送回 Javascript 的新 access_token。 awesome library将所有其他请求排队,所以当我带着新 token 回来时,我可以告诉它继续 authService.loginConfirmed(); .

    刷新实际上非常简单,因为您只需使用 TokenClient来自 IdentityServer3。完整方法代码:
        [HttpPost]
    [AllowAnonymous]
    public async Task<JsonResult> RefreshToken(string refreshToken)
    {
    var tokenClient = new TokenClient(IdentityServerConstants.IdentityServerUrl + "/connect/token", "my-application-id", "my-application-secret");
    var response = await tokenClient.RequestRefreshTokenAsync(StringEncryptor.Decrypt(refreshToken));

    return Json(new {response.AccessToken});
    }

    欢迎评论,这可能是最好的方法。

    关于asp.net - IdentityServer 3 使用刷新 token 刷新用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34203067/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com