c# - 如何通过中间件更新 .Net Core 3.x 中的声明值
问题描述
我有一些旨在执行某些逻辑的中间件。该逻辑的一部分是在用户通过身份验证后更新声明值。我想知道是否可以这样做?
public class MyMiddleware
{
public async Task Invoke(HttpContext context)
{
//logic omitted
var claims = new List<Claim> { new Claim("MyValue", "test") }
context.User.AddIdentity(new ClaimsIdentity(claims));
}
}
到目前为止,我发现的唯一方法是在上面的示例中。但是,我并不完全理解这种方法。上述内容会覆盖任何现有的声明还是会有其他行为?
编辑:在我的测试中,上面的代码不起作用。正如我在下一个请求中查看它时从未实际添加的声明一样。
我也尝试了以下方法,但效果相同,下一次请求时索赔并未持续。
public class MyMiddleware
{
public async Task Invoke(HttpContext context)
{
//logic omitted
var claimsIdentity = (ClaimsIdentity) context.User.Identity;
var identity = new ClaimsIdentity(claimsIdentity);
var myClaim = identity.Claims.FirstOrDefault(x => x.Type.Equals(userExpirationName));
if(myClaim != null) identity.RemoveClaim(myClaimName);
identity.AddClaim(new Claim(myClaimName, "test"));
context.User.AddIdentity(identity);
}
}
解决方案
推荐阅读
- apexcharts - 在 ApexCharts 中隐藏 xAxis 类型类别的重叠标签
- docker - 从 Kubernetes 注释/docker 标签/docker 配置中查看原始图像标签
- python - Python 包使用(反向依赖扩展到未安装的)
- sql - SQL Server 2012 未在更新语句中使用专门创建的非聚集索引并导致死锁
- reporting-services - 我们如何在 SSRS 中更改行着色
- php - Wordpress rest_pre_serve_request 产生 PHP 标头警告
- reactjs - reactJS url参数名称在可选时留在url中
- android - build.gradle 文件中的 Groovy MissingPropertyException
- laravel - Laravel - 如何在存储中保存的刀片视频中显示?
- javascript - 在多个 div 之间切换并将文本移动到单个块中