我正在使用asp.net mvc 4.当用户注册时,我添加了3个声明(名字,姓氏,显示名称)。声明添加正确,我可以在数据库中检查它们。
然而,当我想得到这样的声明:
ClaimsPrincipal user = HttpContext.Current.GetOwinContext().Authentication.User;
Displayname = user.Claims.FirstOrDefault(c => c.Type == "Displayname").Value;
我收到NullReferenceException
并检查了声明值,我看到我添加的声明未被提取。
但是,如果我注销并再次登录,也会获取这些声明。我应该怎么做在注册时添加的声明,第一次被添加到经过身份验证的用户?
以下是我添加声明的方式:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Username, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
await UserManager.AddClaimAsync(user.Id, new Claim("Firstname", model.Firstname));
await UserManager.AddClaimAsync(user.Id, new Claim("Lastname", model.Lastname));
await UserManager.AddClaimAsync(user.Id, new Claim("Displayname", $"{model.Firstname} {model.Lastname}"));
return RedirectToAction("Index", "Home");
}
AddErrors(result);
}
return View(model);
}
答案 0 :(得分:2)
我发现了问题。
问题是我在登录后添加了声明:
await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
await UserManager.AddClaimAsync(user.Id, new Claim("Firstname", model.Firstname));
await UserManager.AddClaimAsync(user.Id, new Claim("Lastname", model.Lastname));
await UserManager.AddClaimAsync(user.Id, new Claim("Displayname", $"{model.Firstname} {model.Lastname}"));
将代码更改为此解决了问题:
await UserManager.AddClaimAsync(user.Id, new Claim("Firstname", model.Firstname));
await UserManager.AddClaimAsync(user.Id, new Claim("Lastname", model.Lastname));
await UserManager.AddClaimAsync(user.Id, new Claim("Displayname", $"{model.Firstname} {model.Lastname}"));
await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);