我在MVC5项目中使用OWIN身份验证.

 private async Task SignInAsync(ApplicationUser user, bool isPersistent)
        {
            var AccountNo = "101";
            AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
            var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
            identity.AddClaim(new Claim(ClaimTypes.UserData, AccountNo));
            AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent, RedirectUri="Account/Index"}, identity);
        }

如你所见,我在索赔单上加了AccountNo个.

现在,我如何在我的申请中的某个时候更新这个声明?到目前为止,我有:

 public string AccountNo
        {

            get
            {
                var CP = ClaimsPrincipal.Current.Identities.First();
                var Account= CP.Claims.FirstOrDefault(p => p.Type == ClaimTypes.UserData);
                return Account.Value;
            }
            set
            {
                var CP = ClaimsPrincipal.Current.Identities.First();
                var AccountNo= CP.Claims.FirstOrDefault(p => p.Type == ClaimTypes.UserData).Value;
                CP.RemoveClaim(new Claim(ClaimTypes.UserData,AccountNo));
                CP.AddClaim(new Claim(ClaimTypes.UserData, value));
            }

        }

当我试图删除索赔时,我得到了以下例外:

索赔

如何删除和更新索赔?

推荐答案

我创建了一个扩展方法来基于给定的ClaimsIdentity添加/更新/读取索赔

namespace Foobar.Common.Extensions
{
    public static class Extensions
    {
        public static void AddUpdateClaim(this IPrincipal currentPrincipal, string key, string value)
        {
            var identity = currentPrincipal.Identity as ClaimsIdentity;
            if (identity == null)
                return;

            // check for existing claim and remove it
            var existingClaim = identity.FindFirst(key);
            if (existingClaim != null)
                identity.RemoveClaim(existingClaim);

            // add new claim
            identity.AddClaim(new Claim(key, value));
            var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
            authenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(new ClaimsPrincipal(identity), new AuthenticationProperties() { IsPersistent = true });
        }

        public static string GetClaimValue(this IPrincipal currentPrincipal, string key)
        {
            var identity = currentPrincipal.Identity as ClaimsIdentity;
            if (identity == null)
                return null;

            var claim = identity.Claims.FirstOrDefault(c => c.Type == key);
            return claim.Value;
        }
    }
}

然后使用它

using Foobar.Common.Extensions;

namespace Foobar.Web.Main.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            // add/updating claims
            User.AddUpdateClaim("key1", "value1");
            User.AddUpdateClaim("key2", "value2");
            User.AddUpdateClaim("key3", "value3");
        }

        public ActionResult Details()
        {
            // reading a claim
            var key2 = User.GetClaimValue("key2");          
        }
    }
}

Asp.net相关问答推荐

使用 Asp.Net MVC 和 KnockoutJS 处理日期

如何在 C# 中生成一个随机的 10 位数字?

IIS HTTP 错误 500.19

带有模型的 mvc 上传文件 - 第二个参数发布的文件为空

指定的 CGI 应用程序遇到错误,服务器终止了进程

使 ASP.NET WCF 将字典转换为 JSON,省略键和值标签

捕获对 ASP.NET ASMX Web 服务的 SOAP 请求

如何防止 Azure 网站进入Hibernate 状态?

jquery 1.9.0 和 modernizr 无法使用 ASP.NET Web 优化框架进行缩小

是否可以使用 Membership API 更改用户名

解析 JSON 响应的最简单方法

从 RowDataBound 事件的 gridview 从单元格中获取值

ASP.NET IIS - 请求何时排队?

如何使用自动生成的列隐藏 ASP.NET GridView 中的列?

您使用哪个 .NET Memcached 客户端,EnyimMemcached 与 BeITMemcached?

模型是否包含字段而不将其添加到数据库中?

ASP.NET 5、EF 7 和 SQLite - SQLite 错误 1:没有这样的表:博客

ASP.NET 中的嵌套中继器

如何创建代表 colored颜色 的随机十六进制字符串?

如何在asp.net的GridView中按列名而不是按索引获取单元格值