asp.net-mvc-5 – 在GenerateUserIdentityAsync方法的aspnet身份中找不到UserId错误

前端之家收集整理的这篇文章主要介绍了asp.net-mvc-5 – 在GenerateUserIdentityAsync方法的aspnet身份中找不到UserId错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
注册用户后以及登录后我收到UserId未找到错误.因此,注册后,数据保存到数据库和dbo.AspNetUsers表中,id列自动递增,返回类型为int.
AspNetUserClaims表中有UserId列.它有4个Col — Id,UserId,ClaimType,ClaimValue.It具有自动递增的Id列而不是userId.
我最初通过以下链接http://www.asp.net/identity/overview/extensibility/change-primary-key-for-users-in-aspnet-identity成功地将主键从字符串更改为int.

它之前成功运行但是现在它在这条线上给我错误

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser,int> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this,DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }

异常详细信息:System.InvalidOperationException:找不到UserId.
这是完整的堆栈跟踪.你可以在这看到它—- http://pastebin.com/0hp5eAnp

它早先工作正常,但现在当我加入其他表的外键关系时,我不知道那里缺少什么.在数据库中,所有表都是正确创建的,它们之间有适当的关系,但这里缺少一些东西.

我的ApplicationUser类是这样的——-

public class ApplicationUser : IdentityUser<int,CustomUserLogin,CustomUserRole,CustomUserClaim>
 {
    public ApplicationUser()
    {
        this.Posts = new HashSet<Post>();
    }
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser,DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
    public class CustomUserRole : IdentityUserRole<int> { }
    public class CustomUserClaim : IdentityUserClaim<int> { }
    public class CustomUserLogin : IdentityUserLogin<int> { }

    public class CustomRole : IdentityRole<int,CustomUserRole>
   {
    public CustomRole() { }
    public CustomRole(string name) { Name = name; }
}

public class CustomUserStore : UserStore<ApplicationUser,CustomRole,int,CustomUserClaim>
{
    public CustomUserStore(ApplicationDbContext context)
        : base(context)
    {
    }
}

public class CustomRoleStore : RoleStore<CustomRole,CustomUserRole>
{
    public CustomRoleStore(ApplicationDbContext context)
        : base(context)
    {
    }
}

我的IdentityConfig.cs类文件是这样的——-

// Configure the application user manager used in this application. UserManager is defined in ASP.NET Identity and is used by the application.
public class ApplicationUserManager : UserManager<ApplicationUser,int>
{
    public ApplicationUserManager(IUserStore<ApplicationUser,int> store)
        : base(store)
    {
    }

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options,IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new CustomUserStore(context.Get<ApplicationDbContext>()));
        // Configure validation logic for usernames
        manager.UserValidator = new UserValidator<ApplicationUser,int>(manager)
        {
            AllowOnlyAlphanumericUserNames = false,RequireUniqueEmail = true
        };

        // Configure validation logic for passwords
        manager.PasswordValidator = new PasswordValidator
        {
            requiredLength = 1,//RequireNonLetterOrDigit = true,//requiredigit = true,//RequireLowercase = true,//RequireUppercase = true,};

        // Configure user lockout defaults
        manager.UserLockoutEnabledByDefault = true;
        manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
        manager.MaxFailedAccessAttemptsBeforeLockout = 5;

        // Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
        // You can write your own provider and plug it in here.
        manager.RegisterTwoFactorProvider("Phone Code",new PhoneNumberTokenProvider<ApplicationUser,int>
        {
            MessageFormat = "Your security code is {0}"
        });
        manager.RegisterTwoFactorProvider("Email Code",new EmailTokenProvider<ApplicationUser,int>
        {
            Subject = "Security Code",BodyFormat = "Your security code is {0}"
        });
        manager.EmailService = new EmailService();
        manager.SmsService = new SmsService();
        var dataProtectionProvider = options.DataProtectionProvider;
        if (dataProtectionProvider != null)
        {
            manager.UserTokenProvider = 
                new DataProtectorTokenProvider<ApplicationUser,int>(dataProtectionProvider.Create("ASP.NET Identity"));
        }
        return manager;
    }
}

// Configure the application sign-in manager which is used in this application.
public class ApplicationSignInManager : SignInManager<ApplicationUser,int>
{
    public ApplicationSignInManager(ApplicationUserManager userManager,IAuthenticationManager authenticationManager)
        : base(userManager,authenticationManager)
    {
    }

    public override Task<ClaimsIdentity> CreateUserIdentityAsync(ApplicationUser user)
    {
        return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager);
    }

    public static ApplicationSignInManager Create(IdentityFactoryOptions<ApplicationSignInManager> options,IOwinContext context)
    {
        return new ApplicationSignInManager(context.GetUserManager<ApplicationUserManager>(),context.Authentication);
    }
}

我已经看到很多stackoverflow的答案,但没有让它工作.可以有人plzz plzz看到缺少什么,我现在应该做什么.提前谢谢.
在这里,在applicationUser类中,在Id列中,它在工具提示显示一些警告和消息,如下所示——-
models.ApplicationUSer.ID隐藏继承的成员
Microsoft.Aspnet.Identity.EntityFramework.IDentity
用户名.使当前成员覆盖
该实现,否则添加override关键字
添加新关键字,其中x只是命名空间.

我在App_Start文件夹中的StartUp.Auth.cs是这样的——

public partial class Startup
    {
     public void ConfigureAuth(IAppBuilder app)
     {
        // Configure the db context,user manager and signin manager to use a single instance per request
        app.CreatePerOwinContext(ApplicationDbContext.Create);
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

        // Enable the application to use a cookie to store information for the signed in user
        // and to use a cookie to temporarily store information about a user logging in with a third party login provider
        // Configure the sign in cookie
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,LoginPath = new PathString("/Account/Login"),Provider = new CookieAuthenticationProvider
            {
                // Enables the application to validate the security stamp when the user logs in.
                // This is a security feature which is used when you change a password or add an external login to your account.  
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager,ApplicationUser,int>(
                    validateInterval: TimeSpan.FromMinutes(30),regenerateIdentityCallback: (manager,user) => user.GenerateUserIdentityAsync(manager),getUserIdCallback:(id)=>(id.GetUserId<int>()))
            }
        });            
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        // Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process.
        app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie,TimeSpan.FromMinutes(5));

        // Enables the application to remember the second login verification factor such as phone or email.
        // Once you check this option,your second step of verification during the login process will be remembered on the device where you logged in from.
        // This is similar to the RememberMe option when you log in.
        app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);

        // Uncomment the following lines to enable logging in with third party login providers
        //app.UseMicrosoftAccountAuthentication(
        //    clientId: "",//    clientSecret: "");......................................................................

和我的startUp.cs文件是这样的—-

[assembly: OwinStartupAttribute(typeof(WebApp.Startup))]
   namespace WebApp
   {
    public partial class Startup
   {
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
    }
   }
  }

解决方法

您将不得不拔出ApplicationUserManager以使其更好,更干净并实现更多方法…例如,请参阅以下帖子(它使用您的自定义Key实现了所有方法(示例中为TKey):

http://www.symbolsource.org/MyGet/Metadata/aspnetwebstacknightly/Project/Microsoft.AspNet.Identity.Core/2.0.0-beta1-140211/Release/Default/Microsoft.AspNet.Identity.Core/Microsoft.AspNet.Identity.Core/UserManager.cs?ImageName=Microsoft.AspNet.Identity.Core

您将看到您收到的错误GetSecurityStampAsync也在那里实现.

猜你在找的asp.Net相关文章