MVC5(VS2012)Identity CreateIdentityAsync-值不能为空

问题描述 投票:37回答:7

我正在尝试为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会话对象。我通过我的...

asp.net asp.net-mvc-5 asp.net-identity identity claims-based-identity
7个回答
81
投票

过去有相同的错误,但仅当我使用Entity Framework Migration Tool创建用户时。在创建用户并使用网站签名时,我没有错误。


14
投票

我有类似的问题。解决方案是设置用户实体的SecurityStamp-Property。


2
投票

我做的与@ user3347549相同。


1
投票

默认UserManager将尝试获取声明并添加/删除声明,即使您尚未实现它们。如果您不需要索偿,我发现的解决方案是实现自己的UserManager或实现UserStore中的“不执行任何操作”方法。


0
投票

我必须实现ClaimsIdentityFactory并设置UserManager.ClaimsIdentityFactory属性,即在AccountController类中。


0
投票

就我而言,这是完全不同的东西。这是Owin启动代码顺序的问题


0
投票

当密码少于6个字符时,我遇到了这个问题。大于此的值,我不会收到此错误。

© www.soinside.com 2019 - 2024. All rights reserved.