这是this question的延续。
如果我覆盖userManager:
public class NHibernateAspnetUserManager<TUser> : UserManager<TUser> where TUser : IdentityUser
{
public NHibernateAspnetUserManager(IUserStore<TUser> store) : base(store)
{
}
public override Task<ClaimsIdentity> CreateIdentityAsync(TUser user, string authenticationType)
{
var identity = new ClaimsIdentity();
identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));
return Task.FromResult(identity);
}
}
这不会抛出任何错误但不会记录用户,(日志过程发生但@Request.IsAuthenticated将始终返回false)。如果我不覆盖它,那么我得到一个“System.Security.Claims.Claim..ctor”错误,如另一个问题中所述。尝试解决我自己的用户实现IUserClaimStore但只返回一个新的声明列表。
我不确定默认的usermanager在底层有什么不同。我猜它设置了某种形式的声明身份对象,允许MVC识别某人已登录。
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent}, identity);
修改
找出ctor错误发生的原因。用户对象在没有ID的情况下返回,因此默认的UserManager变得不安。修复了这个并使用了默认的UserManager,它现在不再抛出错误,但仍然没有记录用户。它返回的身份对象看起来很好。我可以告诉你。
进一步说明
所以我安装了VS2013并复制了商店和NHibernate repo,这些都是第一次工作。我只能假设在创建它和在VS2012中更新MVC5并在VS2013中进行更新之间存在一些差异。
答案 0 :(得分:0)
所以主要问题是您不尊重方法中的身份验证类型,您需要为DefaultAuthenticationType.ApplicationCookie创建一个ClaimsIdentity,这是默认声明工厂所做的:
public override Task<ClaimsIdentity> CreateIdentityAsync(TUser user, string authenticationType)
{
var id = new ClaimsIdentity(authenticationType, UserNameClaimType, RoleClaimType);
id.AddClaim(new Claim(UserIdClaimType, ConvertIdToString(user.Id), ClaimValueTypes.String));
id.AddClaim(new Claim(UserNameClaimType, user.UserName, ClaimValueTypes.String));
答案 1 :(得分:0)
我遇到了使用ASP.NET 4.5实现自定义标识的相同问题。问题实际上是在声明集合中添加空值(请参阅注释):
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new AppUser { UserName = model.UserName };
// after the UserManager creates a user, all the properties of
// AppUser except "UserName" are automatically discarded
var result = await UserManager.CreateAsync(new AppUser
{
UserRealName = model.UserRealName,
UserName = model.UserName,
Password = model.Password
}, model.Password);
if (result.Succeeded)
{
// So we need to re-get the new user
user = AppUser.GetByName(model.UserName);
await SignInAsync(user, false); // otherwise here we will add null values ...
return RedirectToAction("Index", "Home");
}
AddErrors(result);
}
return View(model);
}
private async Task SignInAsync(AppUser user, Boolean isPersistent)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
var identity = await UserManager.CreateIdentityAsync(user,
DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties // ... into the list of
// claims for all AppUser properties except UserName
{ IsPersistent = isPersistent }, identity);
}