分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

asp.net core系列 47 Identity 自定义用户数据

发布时间:2023-09-06 02:35责任编辑:胡小海关键词:暂无标签

一.概述

         接着上篇的WebAppIdentityDemo项目,将自定义用户数据添加到Identity DB,自定义扩展的用户数据类应继承IdentityUser类, 文件名为Areas / Identity / Data / {项目名称}User.cs。自定义的用户数据模型属性需要使用[PersonalData]来修饰,以便自动下载和删除。使数据能够下载和删除有助于满足GDPR要求。

  1.1 自定义用户数据类 WebAppIdentityDemo.Areas.Identity.Data。

 ???public class WebAppIdentityDemoUser:IdentityUser ???{ ???????/// <summary> ???????/// Full name ???????/// </summary> ???????[PersonalData] ???????public string Name { get; set; } ???????/// <summary> ???????/// Birth Date ???????/// </summary> ???????[PersonalData] ???????public DateTime DOB { get; set; } ???}

    使用属性修饰PersonalData特性是:

      使用Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml 页调用UserManager.Delete

      使用Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml 页下载用户数据

  1.2 修改IdentityHostingStartup

    将Startup中有关identity的服务移到该文件中,好集中管理。

 ??public class IdentityHostingStartup : IHostingStartup ???{ ???????public void Configure(IWebHostBuilder builder) ???????{ ???????????builder.ConfigureServices((context, services) => { ???????????????services.AddDbContext<ApplicationDbContext>(options => ???????????????????options.UseSqlServer( ???????????????????????context.Configuration.GetConnectionString("DefaultConnection"))); ???????????????services.AddDefaultIdentity<WebAppIdentityDemoUser>() ??????????????????.AddDefaultUI() ??????????????????.AddEntityFrameworkStores<ApplicationDbContext>(); ???????????????services.Configure<IdentityOptions>(options => ???????????????{ ???????????????????// Password settings. ???????????????????options.Password.RequireDigit = true; ???????????????????options.Password.RequireLowercase = true; ???????????????????options.Password.RequireNonAlphanumeric = true; ???????????????????options.Password.RequireUppercase = true; ???????????????????options.Password.RequiredLength = 6; ???????????????????options.Password.RequiredUniqueChars = 1; ???????????????????// Lockout settings. ???????????????????options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5); ???????????????????options.Lockout.MaxFailedAccessAttempts = 5; ???????????????????options.Lockout.AllowedForNewUsers = true; ???????????????????// User settings. ???????????????????options.User.AllowedUserNameCharacters = ???????????????????"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+"; ???????????????????options.User.RequireUniqueEmail = false; ???????????????}); ???????????????services.ConfigureApplicationCookie(options => ???????????????{ ???????????????????// Cookie settings ???????????????????options.Cookie.HttpOnly = true; ???????????????????options.ExpireTimeSpan = TimeSpan.FromMinutes(5); ???????????????????options.LoginPath = $"/Identity/Account/Login"; ???????????????????options.LogoutPath = $"/Identity/Account/Logout"; ???????????????????options.AccessDeniedPath = $"/Identity/Account/AccessDenied"; ???????????????}); ???????????}); ???????} ???}

  1.3 修改DbContext上下文

 ???// public class ApplicationDbContext : IdentityDbContext ???public class ApplicationDbContext : IdentityDbContext<WebAppIdentityDemoUser> ???{ ???????public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) ???????????: base(options) ???????{ ???????} ???????protected override void OnModelCreating(ModelBuilder builder) ???????{ ???????????base.OnModelCreating(builder); ???????????// Customize the ASP.NET Core Identity model and override the defaults if needed. ???????????// For example, you can rename the ASP.NET Core Identity table names and more. ???????????// Add your customizations after calling base.OnModelCreating(builder); ???????} ???}

  1.4 数据库版本迁移

  PM> Add-Migration IdentitySchema2  PM> Update-Database IdentitySchema2

  1.5 更新注册页面

    在开发中,会员系统要重用修改的页面,把IdentityUser 改成WebAppIdentityDemoUser。如果没改将报错:未解析到服务IdentityUser。红色部分为修改的代码

 ???[AllowAnonymous] ???public class RegisterModel : PageModel ???{ ???????// private readonly SignInManager<IdentityUser> _signInManager; ???????//private readonly UserManager<IdentityUser> _userManager; ???????private readonly SignInManager<WebAppIdentityDemoUser> _signInManager; ???????private readonly UserManager<WebAppIdentityDemoUser> _userManager; ???????private readonly ILogger<RegisterModel> _logger; ???????private readonly IEmailSender _emailSender; ???????public RegisterModel( ???????????UserManager<WebAppIdentityDemoUser> userManager, ???????????SignInManager<WebAppIdentityDemoUser> signInManager, ???????????ILogger<RegisterModel> logger, ???????????IEmailSender emailSender) ???????{ ???????????_userManager = userManager; ???????????_signInManager = signInManager; ???????????_logger = logger; ???????????_emailSender = emailSender; ???????} ???????[BindProperty] ???????public InputModel Input { get; set; } ???????public string ReturnUrl { get; set; } ???????public class InputModel ???????{ ???????????[Required] ???????????[DataType(DataType.Text)] ???????????[Display(Name = "Full name")] ???????????public string Name { get; set; } ???????????[Required] ???????????[Display(Name = "Birth Date")] ???????????[DataType(DataType.Date)] ???????????public DateTime DOB { get; set; } ???????????[Required] ???????????[EmailAddress] ???????????[Display(Name = "Email")] ???????????public string Email { get; set; } ???????????[Required] ???????????[StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] ???????????[DataType(DataType.Password)] ???????????[Display(Name = "Password")] ???????????public string Password { get; set; } ???????????[DataType(DataType.Password)] ???????????[Display(Name = "Confirm password")] ???????????[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] ???????????public string ConfirmPassword { 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 IdentityUser { UserName = Input.Email, Email = Input.Email }; ???????????????var user = new WebAppIdentityDemoUser ???????????????{ ???????????????????UserName = Input.Email, ???????????????????Email = Input.Email, ???????????????????Name = Input.Name, ???????????????????DOB = Input.DOB ???????????????}; ???????????????var result = await _userManager.CreateAsync(user, Input.Password); ???????????????if (result.Succeeded) ???????????????{ ???????????????????_logger.LogInformation("User created a new account with password."); ???????????????????var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); ???????????????????var callbackUrl = Url.Page( ???????????????????????"/Account/ConfirmEmail", ???????????????????????pageHandler: null, ???????????????????????values: new { userId = user.Id, code = code }, ???????????????????????protocol: Request.Scheme); ???????????????????await _emailSender.SendEmailAsync(Input.Email, "Confirm your email", ???????????????????????$"Please confirm your account by <a href=‘{HtmlEncoder.Default.Encode(callbackUrl)}‘>clicking here</a>."); ???????????????????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(); ???????} ???}

  

@page@model RegisterModel@{ ???ViewData["Title"] = "Register";}<h1>@ViewData["Title"]</h1><div class="row"> ???<div class="col-md-4"> ???????<form asp-route-returnUrl="@Model.ReturnUrl" method="post"> ???????????<h4>Create a new account.</h4> ???????????<hr /> ???????????<div asp-validation-summary="All" class="text-danger"></div>

???????????<div class="form-group"> ???????????????<label asp-for="Input.Name"></label> ???????????????<input asp-for="Input.Name" class="form-control" /> ???????????????<span asp-validation-for="Input.Name" class="text-danger"></span> ???????????</div> ???????????<div class="form-group"> ???????????????<label asp-for="Input.DOB"></label> ???????????????<input asp-for="Input.DOB" class="form-control" /> ???????????????<span asp-validation-for="Input.DOB" class="text-danger"></span> ???????????</div>

???????????<div class="form-group"> ???????????????<label asp-for="Input.Email"></label> ???????????????<input asp-for="Input.Email" class="form-control" /> ???????????????<span asp-validation-for="Input.Email" class="text-danger"></span> ???????????</div> ???????????<div class="form-group"> ???????????????<label asp-for="Input.Password"></label> ???????????????<input asp-for="Input.Password" class="form-control" /> ???????????????<span asp-validation-for="Input.Password" class="text-danger"></span> ???????????</div> ???????????<div class="form-group"> ???????????????<label asp-for="Input.ConfirmPassword"></label> ???????????????<input asp-for="Input.ConfirmPassword" class="form-control" /> ???????????????<span asp-validation-for="Input.ConfirmPassword" class="text-danger"></span> ???????????</div> ???????????<button type="submit" class="btn btn-primary">Register</button> ???????</form> ???</div></div>@section Scripts { ???<partial name="_ValidationScriptsPartial" />}

    启动程序,运行注册页,保存成功后,查看数据库,如下所示:

  1.6 其它相关页修改

    下面这些最基本的页面,都需要把IdentityUser 改成WebAppIdentityDemoUser。

      登录页 /Identity/Account/Login

      注册页 Identity/Account/Register

      会员管理后台主页 /Identity/Account/Manage/index

      个人资料页 /Identity/Account/Manage/PersonalData

      个人资料删除 /Identity/Account/Manage/DeletePersonalData

      个人资料下载/Identity/Account/Manage/ DownloadPersonalData.cshtml

      分部页 _ManageNav.cshtml

  

  下面是 Account/Manage/Index.cshtml 页,已经加上自定义的二个用户字段信息,具体更新代码见官网

    下面是/Identity/Account/Manage/PersonalData.cshtml 页,已经可以下载和删除用户数据

   参考文献

    自定义用户数据

  

asp.net core系列 47 Identity 自定义用户数据

原文地址:https://www.cnblogs.com/MrHSR/p/10578369.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved