asp.net-mvc - 刷新 IdentityServer4 客户端中的访问 token

标签 asp.net-mvc openid-connect identityserver4

我想知道如何使用混合流刷新 IdentityServer4 客户端中的访问 token ,该流是使用 ASP.NET Core MVC 构建的。

如果我正确理解了整个概念,客户端首先需要具有“offline_access”范围,以便能够使用刷新 token ,这是启用短期访问 token 和撤销刷新 token 的最佳实践,以防止任何新的访问 token 发给客户。

我成功获得了访问 token 和刷新 token ,但是我应该如何处理 MVC 客户端中访问 token 的实际更新过程?

OpenId Connect (OIDC) 中间件可以自动处理吗?或者我应该在我调用 WEB Api 的任何地方检查访问 token 的过期时间,方法是基本上检查访问 token 是否已过期或将很快过期(即将到来的 30 秒),然后通过使用刷新 token 调用 token 端点来刷新访问 token ?

是否推荐使用IdentityModel2图书馆TokenClient扩展方法RequestRefreshTokenAsync在我的用于调用 token 端点的 Controller 操作方法中?

我已经看到在 OIDC 中间件事件中请求访问 token 并使用响应存储包含过期日期时间的声明的代码。问题是我的 OIDC 以某种方式已经自动请求访问 token ,因此在收到第一个访问 token 后直接请求新的访问 token 感觉并不好。

Controller 操作方法示例 没有 访问 token 刷新逻辑:

public async Task<IActionResult> GetInvoices()
    {
        var token = await HttpContext.Authentication.GetTokenAsync("access_token");

        var client = new HttpClient();
        client.SetBearerToken(token);

        var response = await client.GetStringAsync("http://localhost:5001/api/getInvoices");
        ViewBag.Json = JArray.Parse(response).ToString();

        return View();
    }

最佳答案

OIDC 中间件将 不是 为你照顾好这个。当它检测到 HTTP 401 时正在执行它响应,然后将用户重定向到 IdentityServer 登录页面。重定向到您的 MVC 应用程序后,它会将声明转换为 ClaimsIdentity并将其传递给 Cookies 中间件,该中间件会将其具体化为 session cookie。

只要 cookie 仍然有效,其他所有请求都不会涉及 OIDC 中间件。

所以你必须自己照顾这个。您要考虑的另一件事是,无论何时您要刷新访问 token ,都必须更新现有的,以免丢失。如果您不这样做, session cookie 将始终包含相同的标记 - 原始标记 - 您每次都会刷新它。

我找到的一个解决方案是将其挂接到 Cookies 中间件中。
这是一般流程:

  • 在每个请求上,使用 Cookies 中间件事件来检查访问 token
  • 如果它接近到期时间,请请求一个新的
  • 替换 ClaimsIdentity 中的新访问和刷新 token
  • 指示 Cookies 中间件更新 session cookie,使其包含新 token

  • 我喜欢这种方法的一点是,在您的 MVC 代码中,您几乎可以保证始终拥有有效的访问 token ,除非引用 token 连续多次失败。

    我不喜欢的是它与 MVC 紧密相连——更具体地说是 Cookies 中间件——所以它不是真正的可移植的。

    你可以看看this GitHub repo我放在一起。它确实使用了 IdentityModel因为这会处理所有事情并隐藏您必须对 IdentityServer 进行的 HTTP 调用的大部分复杂性。

    关于asp.net-mvc - 刷新 IdentityServer4 客户端中的访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41168304/

    相关文章:

    .net - 将敏感信息放入 Web.config 文件中是一种不好的做法吗?

    sql - Entity Framework 6 - 保存更改

    asp.net-mvc - MVC 3 _ViewStart,目的是什么?

    asp.net-identity - 转换和规范化来自外部身份验证提供商的声明的最佳方法

    asp.net-mvc - 从 Controller 中的强类型 View 获取数据

    c# - 使用授权中间件而不是授权属性 ASP NET Core

    java - 使用 Spring Security Adapter 时的 Keycloak session 超时行为

    oauth-2.0 - 有没有办法从 Identity Server 中的客户端更新 IDP session token

    c# - ASP.NET Core IdentityServer4 - 声明列表

    profile - IdentityServer4 Net Core 2未调用自定义iProfileService