代码之家  ›  专栏  ›  技术社区  ›  mahmoud fathy

类型'Microsoft.AspNetCore.Identity.UserManager':尝试扩展IdentityUser时?

  •  3
  • mahmoud fathy  · 技术社区  · 8 年前

    我正在使用asp.net在一台mac机器上,我正在尝试为我的asp.net这是一个很好的基于MVITC的应用程序。

    https://docs.microsoft.com/en-us/aspnet/core/security/authentication/add-user-data?view=aspnetcore-2.1&tabs=visual-studio

    我面临这样的错误:

    {“error”:“类型没有服务 'Microsoft.AspNetCore.Identity.UserManager`1[Microsoft.AspNetCore.Identity.IdentityUser]' 已注册。“}

    启动.cs

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
    
            // [...]
    
            services.AddDbContext<ApplicationDbContext>(
                options => options.UseSqlServer(identityDbContextConnection));
            // Relevant part: influences the error
            services.AddIdentity<ApplicationUser, IdentityRole>()
                    .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();
    
    
            services.AddMvc(config =>
            {
                var policy = new AuthorizationPolicyBuilder()
                                 .RequireAuthenticatedUser()
                                 .Build();
                config.Filters.Add(new AuthorizeFilter(policy));
            });
        }
    

    应用程序用户.cs

        // Add profile data for application users by adding properties to the ApplicationUser class
    public class ApplicationUser : IdentityUser
    {
        [Required]
        public string DrivingLicense { get; set; }
    }
    

    注册.cshtml.cs

    public class RegisterModel : PageModel
    {
        private readonly SignInManager<ApplicationUser> _signInManager;
        private readonly UserManager<ApplicationUser> _userManager;
        private readonly ILogger<RegisterModel> _logger;
        private readonly IServiceProvider _services;
    
        public RegisterModel(
            UserManager<ApplicationUser> userManager,
            SignInManager<ApplicationUser> signInManager,
            ILogger<RegisterModel> logger,
            IServiceProvider services
        )
        {
            _userManager = userManager;
            _signInManager = signInManager;
            _logger = logger;
            _services = services;
        }
    
        [BindProperty]
        public InputModel Input { get; set; }
    
        public string ReturnUrl { get; set; }
    
        public class InputModel
        {
            [Required]
            [EmailAddress]
            [Display(Name = "Email")]
            public string Email { get; set; }
    
            // Added for ApplicationUser
            [Required]
            [Display(Name = "Driving License")]
            public string DrivingLicense { get; set; }
            // -----------------------------
            // [...]
        }
    
        public void OnGet(string returnUrl = null)
        {
            ReturnUrl = returnUrl;
        }
    
        public async Task<IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser { 
                    UserName = Input.Email, 
                    Email = Input.Email, 
                    DrivingLicense = Input.DrivingLicense // property added by ApplicationUser
                };
                var result = await _userManager.CreateAsync(user, Input.Password);
                if (result.Succeeded)
                {
    
                    _logger.LogInformation("User created a new account with password.");
    
                    await _signInManager.SignInAsync(user, isPersistent: false);
                    return LocalRedirect(returnUrl);
                }
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }
    
            // If we got this far, something failed, redisplay form
            return Page();
        }
    }
    

    源代码段

    public class InputModel
        {
            [Required]
            [EmailAddress]
            public string Email { get; set; }
    
            // Added for ApplicationUser
            [Required]
            [Display(Name = "Driving License")]
            public string DrivingLicense { get; set; }
            // -----------------------------
    
            [Phone]
            [Display(Name = "Phone number")]
            public string PhoneNumber { get; set; }
        }
    
    
    
    public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }
    
            // [...]
    
            // Added for ApplicationUser
            if (Input.DrivingLicense != user.DrivingLicense)
            {
                user.DrivingLicense = Input.DrivingLicense;
            }
            await _userManager.UpdateAsync(user);
            // -------------------------
    
            await _signInManager.RefreshSignInAsync(user);
            StatusMessage = "Your profile has been updated";
            return RedirectToPage();
        }
    

        public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
    
        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
        }
    }
    

    我不能只按照微软官方的编辑指南来做/索引.cshtml因为在我执行CLI步骤时,文件没有被搭建起来!

    注意,当我在中用IdentityUser替换ApplicationUser时 启动.cs 具体如下: services.AddIdentity<IdentityUser, IdentityRole>() 应用程序将打开,但注册当然无法按预期正常工作。

    1 回复  |  直到 8 年前
        1
  •  4
  •   Olawale david    6 年前

    问题在于_LoginPartial.cshtml'

    把这个拿走

    @using Microsoft.AspNetCore.Identity
    @inject SignInManager<IdentityUser> SignInManager
    @inject UserManager<IdentityUser> UserManager
    

    加上这个

    @using Microsoft.AspNetCore.Identity
    @inject SignInManager<ApplicationUser> SignInManager
    @inject UserManager<ApplicationUser> UserManager
    

    这就是解决办法

        2
  •  3
  •   Anish Manchappillil    7 年前

    1)扩展IdentityUser或IdentityRole

    public class ApplicationUser : IdentityUser<Guid>
    {
        public DateTime JoinTime { get; set; } = DateTime.Now;
        public DateTime DOB { get; set; } = Convert.ToDateTime("01-Jan-1900");
    }
    public class ApplicationRole : IdentityRole<Guid>
    {
        public string Description { get; set; }
    }
    

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
        {
    
        }
    }
    

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    
        services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, AppClaimsPrincipalFactory>();
    
    
        services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    
        services.AddIdentity<ApplicationUser, ApplicationRole>().AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultUI()
            .AddDefaultTokenProviders();
    
    }
    

    更新_LoginPartial.cshtml(共享-->查看)

    @inject SignInManager<ApplicationUser> SignInManager
    @inject UserManager<ApplicationUser> UserManager
    
        3
  •  2
  •   Tesfaye    7 年前

    核心2也有同样的问题。

    您需要检查的另一个区域是文件_ManageNav.cshtml管理器在那里你必须更新线路 @inject SignInManager<IdentityUser> SignInManager @inject SignInManager<YOURCUSTOMMODEL> SignInManager .