首页 > 解决方案 > 更新 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 声明。


还是有更好的方法来处理这种情况?

谢谢。

标签: c#asp.net-coreasp.net-identity

解决方案


您可以像代码一样将令牌存储在 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");
});

推荐阅读