c# - 更新 ASP.NET Core 2.1 身份验证 Cookie 中的声明
问题描述
如何更新 ASP.NET Core 2.1 身份验证 Cookie 中的声明值?
我的问题的一点背景:
我有一个使用 Cookie 身份验证的 dotnet Core 2.1 MVC 项目。
该网站从使用不记名令牌进行身份验证的 API 获取大部分数据。不记名令牌的寿命相当短,API 还返回一个刷新令牌以获取新的不记名令牌。
当用户登录时,我从 API 获取令牌并将其作为声明存储在 auth cookie 中,如下所示:
var props = new AuthenticationProperties{ ... };
var claims = new[]
{
new Claim("ApiAccessToken", apiToken.AccessToken),
new Claim("ApiRefreshToken", apiToken.RefreshToken),
// other claims ...
};
var identity = new ClaimsIdentity(claims,
CookieAuthenticationDefaults.AuthenticationScheme);
await Request.HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(identity), props);
我在调用 API 之前使用 Polly 确保身份验证,如果第一次尝试 API 得到 401,我使用刷新令牌来获取新的不记名令牌。我想用这些新值更新 auth cookie 中的 ApiAccessToken 和 ApiRefreshToken 声明。
还是有更好的方法来处理这种情况?
谢谢。
解决方案
您可以像代码一样将令牌存储在 cookie 中。那么你可以像这样获得令牌:
var apiAccessToken = User.Identities.FirstOrDefault(i => i.AuthenticationType == "Cookies")?.Claims.FirstOrDefault(c => c.Type == "ApiAccessToken")?.Value;
var apiRefreshToken = User.Identities.FirstOrDefault(i => i.AuthenticationType == "Cookies")?.Claims.FirstOrDefault(c => c.Type == "ApiRefreshToken")?.Value;
最后,您可以使用 HttpClient 来获取或发布数据到 API,如下所示:
public async Task<T> GetWithTokenAsync<T>(HttpClient httpClient, string uri, string token)
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var response = await httpClient.GetAsync(uri);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsAsync<T>();
}
“T”是您获取或发布数据类型的类型。
在“Startup.cs”的“ConfigureServices”中,你应该像这样配置:
services.AddHttpClient("YourApiName", client =>
{
client.BaseAddress = new Uri("The base address of your api");
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Add("User-Agent", "The application name of your client");
client.DefaultRequestHeaders.Add("ApplicationId", "The application id of your client");
});
推荐阅读
- c - C execvp /bin/sh - 以编程方式交互(dup2 stdin/stdout 等)
- sql - 为特定行值添加列
- linux - 如何在 Linux 的主模式下扫描可用的 WiFi 接入点
- snowflake-cloud-data-platform - 雪花 Varchar 连接
- python - 根据特定列将原始数据集分成两个数据集
- c# - C# .net 核心应用程序在通过 Powershell 执行时不会创建日志文件,但在通过命令行或 Visual Studio 执行时会创建日志文件
- jquery - jQuery UI 自动完成功能无法正常工作
- javascript - 每行文本的不同速度
- flutter - Websocket 在不同的客户端语言上表现不同
- nginx - nginx 1.21.1 - 请求行中的空格 - 400 Bad Request