MVC 4,除非再次登录,否则无法在注册时添加声明

时间:2016-11-22 22:39:25

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我正在使用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);
}

1 个答案:

答案 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);