更新ASP中的声明.NET Core 2.1身份验证Cookie



如何在ASP中更新索赔值。NET Core 2.1身份验证Cookie?

我的问题的一点背景:

我有一个使用Cookie身份验证的dotnet Core 2.1 MVC项目。

网站的大部分数据来自API,该API使用承载令牌进行身份验证。承载令牌的寿命相当短,API还返回刷新令牌以获得新的承载令牌。

当用户登录时,我从API获得一个令牌,并将其作为声明存储在authcookie中,如下所示:

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,我将使用刷新令牌来获得新的承载令牌。我想用这些新值更新authcookie中的ApiAccessToken和ApiRefreshToken声明。


或者有更好的方法来处理这种情况吗?

谢谢。

我相信我的问题的答案是"你没有"。

我最终创建了另一个cookie,其中包含承载令牌和刷新令牌。我对刷新令牌进行了加密。

示例扩展方法代码:

public static void AppendApiAuthCookie(this HttpContext context, ApiAuthToken token, Guid userId)
{
context.Response.Cookies.Append("mytoken", $"bearerToken:{token.BearerToken}|refreshtoken:{token.RefreshToken}|uid:{userId}", 
new CookieOptions
{
HttpOnly = true,
SameSite = SameSiteMode.Strict,
Expires = DateTimeOffset.UtcNow.AddHours(24),
});
}

然后我在注销时删除cookie。

注意(这可能说明了显而易见的一点(:在我的场景中,使用Polly来确保身份验证,Polly策略处理程序会从身份验证提供程序获取一个新的令牌,并更新cookie。您刚刚存储在cookie中的新值在当前请求上下文中无法从cookie中获得。因此,您需要确保在请求的生命周期内,您在某个地方持有新的承载令牌,以便在当前请求上下文中获取它。

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

相关内容

  • 没有找到相关文章

最新更新