我正在尝试为MVC5网站(在VS2012中)设置OAuth。
我正在使用Fluent NHibernate。我已经设置了自己的Userstore并传递了一个存储库对象以访问NHibernate会话对象。我将商店传递给默认的aspnet usermanager提供程序。这最终可以用于本地注册和登录。我没有尝试设置与Facebook的连接/注册。
它获得了成功的帐户。在用户表中添加用户,在登录表中添加记录,然后炸毁。我尚未在用户存储中实现声明,也未在用户对象中放入声明集合。 (不确定是否确实需要这样做,我正在剥离所有可能出问题的东西,以找到问题的根源。)>
炸开的行是,(在帐户控制器中:]
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
在此方法内:
private async Task SignInAsync(IdentityUser user, bool isPersistent)
这是堆栈跟踪的结尾
[ArgumentNullException: Value cannot be null. Parameter name: value] System.Security.Claims.Claim..ctor(String type, String value, String valueType, String issuer, String originalIssuer, ClaimsIdentity subject, String propertyKey, String propertyValue) +14108789 System.Security.Claims.Claim..ctor(String type, String value, String valueType) +62 Microsoft.AspNet.Identity.<CreateAsync>d__0.MoveNext() +481 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +144 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +84 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +49 Web.Controllers.<SignInAsync>d__42.MoveNext() in d:\Google Drive\Development\GoalManagement\Web\Controllers\AccountController.cs:375 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +144 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +84 Web.Controllers.<ExternalLoginConfirmation>d__35.MoveNext() in d:\Google Drive\Development\GoalManagement\Web\Controllers\AccountController.cs:311 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +144 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +84 public class IdentityUser : IUser { public IdentityUser() { Logins = new List<IdentityUserLogin>(); } public string Id { get; set; } public string UserName { get; set; } public string PasswordHash { get; set; } public string SecurityStamp { get; set; } public IList<IdentityUserLogin> Logins { get; set; } } public class IdentityUserLogin { public string LoginProvider { get; set; } public string ProviderKey { get; set; } }
如果需要,我可以包括我的用户存储区代码:我没有将其放入,因为它是一个大文件,可能会分散问题的注意力。
我不确定为什么它甚至试图创建索赔对象,为什么它会爆炸。因为我只有VS2012,所以主要是通过在线示例将其全部修补。
根据@Shoe的建议,我继承自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) { ClaimsIdentity identity = new ClaimsIdentity(); return Task.FromResult(identity); } }
现在它不再引发错误,但实际上并没有验证我使用Facebook注册/登录的次数。
总结。使用@Shoe的信息,我尝试使用[]覆盖两个UserManager.CreateIdentityAsync
:
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); }
并且还尝试使用返回的默认值(空列表)实现IUserClaimStore。
第一个不会通过错误,但不会通过身份验证。稍后仍会通过奇怪的声明“ System.Security.Claims.Claim..ctor”错误
编辑
找出发生ctor错误的原因。用户对象返回时没有ID,因此默认值UserManager
变得不高兴。修复了该问题,并使用了默认的UserManager
,该默认值现在不再引发错误,但仍然无法登录用户。据我所知,它返回的标识对象看起来不错。
我正在尝试为MVC5网站(在VS2012中)设置OAuth。我正在使用Fluent NHibernate。我已经设置了自己的Userstore并传递了一个存储库对象以访问NHibernate会话对象。我通过我的...
过去有相同的错误,但仅当我使用Entity Framework Migration Tool创建用户时。在创建用户并使用网站签名时,我没有错误。
我有类似的问题。解决方案是设置用户实体的SecurityStamp-Property。
我做的与@ user3347549相同。
默认UserManager
将尝试获取声明并添加/删除声明,即使您尚未实现它们。如果您不需要索偿,我发现的解决方案是实现自己的UserManager
或实现UserStore
中的“不执行任何操作”方法。
我必须实现ClaimsIdentityFactory并设置UserManager.ClaimsIdentityFactory属性,即在AccountController类中。
就我而言,这是完全不同的东西。这是Owin启动代码顺序的问题
当密码少于6个字符时,我遇到了这个问题。大于此的值,我不会收到此错误。