我创建了一个实现UserModel
的ViewModel(IUser<int>
)(用于自定义ASP.NET Identity 2.0)
public class UserModel : IUser<int>
{
public int Id { get; set; }
public string SecurityStamp { get; set; }
[Display(Name = "Name")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
public string LastName { get; set; }
public string FullName { get; set; }
[Display(Name = "Username")]
public string UserName { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Display(Name = "E-Mail")]
public string Email { get; set; }
[Display(Name = "Photo")]
public string PhotoPath { get; set; }
public List<Claim> Claims { get; set; }
[IgnoreMapping]
public List<CommentModel> Comments { get; set; }
}
一切顺利,但是GenerateUserIdentityAsync
方法
以下代码是UserModel中的GenerateUserIdentityAsync
:
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<UserModel, int> manager)
{
this.SecurityStamp = Guid.NewGuid().ToString();
this.Claims = new List<Claim>();
ClaimsIdentity userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);//Exception : Value cannot be null. Parameter name: value
return userIdentity;
}
使用以下堆栈跟踪的CreateIdentityAsync
方法发生异常
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) +10798181
System.Security.Claims.Claim..ctor(String type, String value) +34
Microsoft.AspNet.Identity.<CreateAsync>d__0.MoveNext() +1458
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +24
Smartiz.UI.Models.<GenerateUserIdentityAsync>d__2.MoveNext() in e:\Works\Smartiz\Smartiz.UI\Models\UserModels.cs:215
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +24
Smartiz.UI.Controllers.<SignInAsync>d__58.MoveNext() in e:\Works\Smartiz\Smartiz.UI\Controllers\AccountController.cs:448
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21
Smartiz.UI.Controllers.<ExternalLoginCallback>d__3c.MoveNext() in e:\Works\Smartiz\Smartiz.UI\Controllers\AccountController.cs:315
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21
System.Threading.Tasks.TaskHelpersExtensions.ThrowIfFaulted(Task task) +61
System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult) +114
System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeAsynchronousActionMethod>b__36(IAsyncResult asyncResult) +66
System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +47
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +136
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +49
System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +117
System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +323
System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +44
System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +47
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +136
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +50
System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +72
System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +185
System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +42
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +133
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +56
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +40
System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +34
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +70
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +44
System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +39
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +62
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +39
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +39
System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +39
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +70
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +40
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9651188
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
你能指导一下我的错误吗?
答案 0 :(得分:93)
从ASP.NET Identity 1升级到ASP.NET Identity 2时遇到了同样的问题,我通过在SecurityStamp字段中放置一个随机字符串来解决它。
我找到了这个解决方案here。
我希望它也适合你。
答案 1 :(得分:32)
正如Sam在上一个回答的评论中提到的,我对这个问题的解决方案是确保我在EF Migration的Seed方法中创建的用户在SecurityStamp
中有一些东西。一旦我这样做并做了update-database -force
,我就可以登录了。
context.Users.AddOrUpdate(u => u.UserName,
new ApplicationUser
{
UserName = "demo",
Email = "demo@demo.com",
EmailConfirmed = true,
PhoneNumberConfirmed = true,
PasswordHash = password,
PhoneNumber = "111-222-3344",
SecurityStamp = Guid.NewGuid().ToString() //THIS IS WHAT I NEEDED
});
如果您通过其他方式创建了用户,则应该能够通过sql在users db列中添加一个字符串来修复它,并取得相同的成功。
答案 2 :(得分:2)
与Kevin类似,我们也遇到了这个问题。事实证明,当播种数据库时,有人忘记设置产生同样错误的UserName
属性。
答案 3 :(得分:1)
我有一个更通用的问题 - 在运行sql升级例程后,我的一些声明在AspNetUserClaims表中有Null值。
我通过将ClaimValues设置为空字符串来解决问题。
答案 4 :(得分:0)
对我来说,它是覆盖UserName
字段,以便使用我自己的Display
属性。我在ApplicationUser
类中使用了以下内容:
[Display(Name = "Whatever")]
public new string UserName { get; set; }
删除此选项后,登录将按预期工作。我也覆盖了Email
和PhoneNumber
,但是UserName
导致了问题。
答案 5 :(得分:0)
这个问题使我在办公室呆了几个小时。
这是导致问题的行:
result = signinManager.PasswordSignIn(txtthecrmusername.Text, txtthecrmpassword.Text, RememberMe.Checked, shouldLockout:=False)
最后,我向AspNetUsers添加了一个自定义字段,并将其保留为空。匆忙中,我也忘记了在创建用户时将其设置为空。
自定义用户声明不能为空,但标准声明可以为空。
答案 6 :(得分:0)
我坚持SignInManager
无法以相同的错误登录新创建的用户。
解决方案:
我发现,仅在创建角色时向用户提供角色即可解决问题。希望它可以帮助其他人。
await userManager.AddToRoleAsync(user, UserRoles.Basic.ToString());
答案 7 :(得分:0)
对于其他在搜索“值不能为空。参数名称:值”的原因之后来到这里而没有“ CreateIdentityAsync”错误的问题,该问题可能是DataAnnotations中的空值,例如:[Display(Name = "")]
答案 8 :(得分:0)
这个错误的原因是由于验证属性中的空值
[Display(Name = " ")]