gpt4 book ai didi

asp.net-core - 在 ASP.NET Core 中添加 OpenIdConnect 和刷新 token

转载 作者:行者123 更新时间:2023-12-03 16:55:42 26 4
gpt4 key购买 nike

我已添加 AddOpenIdConnectConfigureServices我的 ASP.NET Core 3.1 Razor 应用程序的方法。在 token 过期之前,它运行良好,然后我从 IDP 收到 401 响应。

我见过一个 example这显示了一种手动连接刷新 token 的方法。

但我很犹豫要不要这样做。微软的人似乎不太可能没有考虑刷新 token 。

ASP.NET Core 3.1 是否有办法让刷新 token 自动更新访问 token ?

最佳答案

这是我想出的。由于我找不到很多关于如何在 ASP.NET Core 中使用 cookie 刷新 token 的示例,我想我会在这里发布。 (我在问题中链接到的那个有问题。)
这只是我尝试让这个工作。它尚未用于任何生产环境。此代码位于 ConfigureServices方法。

services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
options.Events = new CookieAuthenticationEvents
{
// After the auth cookie has been validated, this event is called.
// In it we see if the access token is close to expiring. If it is
// then we use the refresh token to get a new access token and save them.
// If the refresh token does not work for some reason then we redirect to
// the login screen.
OnValidatePrincipal = async cookieCtx =>
{
var now = DateTimeOffset.UtcNow;
var expiresAt = cookieCtx.Properties.GetTokenValue("expires_at");
var accessTokenExpiration = DateTimeOffset.Parse(expiresAt);
var timeRemaining = accessTokenExpiration.Subtract(now);
// TODO: Get this from configuration with a fall back value.
var refreshThresholdMinutes = 5;
var refreshThreshold = TimeSpan.FromMinutes(refreshThresholdMinutes);

if (timeRemaining < refreshThreshold)
{
var refreshToken = cookieCtx.Properties.GetTokenValue("refresh_token");
// TODO: Get this HttpClient from a factory
var response = await new HttpClient().RequestRefreshTokenAsync(new RefreshTokenRequest
{
Address = tokenUrl,
ClientId = clientId,
ClientSecret = clientSecret,
RefreshToken = refreshToken
});

if (!response.IsError)
{
var expiresInSeconds = response.ExpiresIn;
var updatedExpiresAt = DateTimeOffset.UtcNow.AddSeconds(expiresInSeconds);
cookieCtx.Properties.UpdateTokenValue("expires_at", updatedExpiresAt.ToString());
cookieCtx.Properties.UpdateTokenValue("access_token", response.AccessToken);
cookieCtx.Properties.UpdateTokenValue("refresh_token", response.RefreshToken);

// Indicate to the cookie middleware that the cookie should be remade (since we have updated it)
cookieCtx.ShouldRenew = true;
}
else
{
cookieCtx.RejectPrincipal();
await cookieCtx.HttpContext.SignOutAsync();
}
}
}
};
})
.AddOpenIdConnect(options =>
{
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;

options.Authority = oidcDiscoveryUrl;
options.ClientId = clientId;
options.ClientSecret = clientSecret;

options.RequireHttpsMetadata = true;

options.ResponseType = OidcConstants.ResponseTypes.Code;
options.UsePkce = true;
// This scope allows us to get roles in the service.
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("offline_access");

// This aligns the life of the cookie with the life of the token.
// Note this is not the actual expiration of the cookie as seen by the browser.
// It is an internal value stored in "expires_at".
options.UseTokenLifetime = false;
options.SaveTokens = true;
});
这段代码有两部分:
  • AddOpenIdConnect :这部分代码为应用程序设置OIDC。这里的关键设置是:
  • SignInScheme :这让 ASP.NET Core 知道您想使用 cookie 来存储您的身份验证信息。
  • * UseTokenLifetime :据我了解,这将 cookie 中的内部“expires_at”值设置为访问 token 的生命周期。 (不是实际的 cookie 过期时间,它停留在 session 级别。)
  • * SaveTokens :据我了解,这就是导致 token 保存在 cookie 中的原因。

  • OnValidatePrincipal : 当 cookie 被验证时调用此部分。在本节中,我们检查访问 token 是否接近或已过期。如果是,则它会刷新并将更新的值存储在 cookie 中。如果 token 无法刷新,则用户将被重定向到登录屏幕。

  • 该代码使用这些必须来自您的配置文件的值:
  • clientId :OAuth2 客户端 ID。也称为客户端 key 、消费者 key 等。
  • clientSecret :OAuth2 客户端密码。也称为消费者 secret 等
  • oidcDiscoveryUrl :指向您的 IDP 众所周知的配置文档的 URL 的基本部分。如果您的众所周知的配置文档位于 https://youridp.domain.com/oauth2/oidcdiscovery/.well-known/openid-configuration那么这个值将是 https://youridp.domain.com/oauth2/oidcdiscovery .
  • tokenUrl :指向您的 IDP token 端点的 URL。例如:https:/youridp.domain.com/oauth2/token
  • refreshThresholdMinutes :如果您等到访问 token 非常接近到期,那么您将面临依赖访问 token 的调用失败的风险。 (如果距离过期还有 5 毫秒,那么它可能会过期,并且在您有机会刷新它之前调用失败。)此设置是您希望将访问 token 视为准备好刷新的过期前的分钟数。

  • * 我是 ASP.NET Core 的新手。因此,我不能 100% 确定这些设置是否符合我的想法。这只是一些对我有用的代码,我想我会分享它。它可能适合您,也可能不适合您。

    关于asp.net-core - 在 ASP.NET Core 中添加 OpenIdConnect 和刷新 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60858985/

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