一. Identity 介绍

  ASP.NET Core Identity是一个会员系统,可为ASP.NET Core应用程序添加登录功能。可以使用SQL Server数据库配置身份以存储用户名,密码和配置文件数据。或者,可以使用另一个持久性存储,例如,Azure表存储。下面学习如何使用Identity注册,登录以及基架标识。

  

  1.1 Identity搭建演示

    下面使用vs 2017来演示:

      1.选择“文件” > “新建” > “项目”。

      2.选择“ASP.NET Core Web应用程序”。 将项目命名WebAppIdentityDemo具有项目下载相同的命名空间。 单击 “确定”。

      3.选择 ASP.NET Core Web MVC应用程序,然后选择更改身份验证。

      4.选择单个用户帐户然后单击确定。

    生成的项目包含了Identity会员系统,目录结构如下所示,生成后的目录结构有疑惑,怎么没看见Identity会员系统相关的model, Controller,cshtml等文件,继续往下了解。

    (1) 修改连接字符串

      找到appsettings.json文件,修改ConnectionStrings的数据库连接字符串, 默认是连接本机sql server数据库,我改成了连接远程数据库。

"ConnectionStrings": {
"DefaultConnection": "Data Source = 172.168.16.75;Initial Catalog =IdentityDB; User ID = hsr;Password =js*2015;"
},

    (2) 基于生成的迁移代码,同步到数据库 

      PM> Update-Database 

    (3) 配置Identity服务

        public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
}); services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddDefaultUI(UIFramework.Bootstrap4)
.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 = ;
options.Password.RequiredUniqueChars = ; // Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes();
options.Lockout.MaxFailedAccessAttempts = ;
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(); options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.SlidingExpiration = true;
}); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

    (4) 确认调用UseAuthentication中间件

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
} app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc();
}

    (5) 启动程序,首页提供了注册,登录的链接

      注册成功后/Identity/Account/Register,在数据库中AspNetUsers表会新增一条数据(密码:Asp.netCore123)。注册成功后,说明数据库连接没有问题,会跳到登录页Identity/Account/Login

      虽然没有看到Identity会员系统相关文件,其实已经内置由Razor类库提供。Identity Razor类库使用该Identity Areas公开端点。例如:

     /Identity/Account/Login

     /Identity/Account/Logout

      /Identity/Account/Manage

  

二. 基架标识(Scaffold Identity )

  ASP.NET Core 2.1 及更高版本提供了ASP.NET Core Identity作为Razor 类库。 包含Identity的应用程序可以应用基架,来有选择地添加包含在Identity Razor 类库 (RCL) 的源代码。 建议生成源代码,以便修改代码和更改行为(根据开发需求扩展Identity)。 例如,可以指示基架生成在注册过程中使用的代码。 生成的代码优先于标识 RCL 中的相同代码。 若要获取的用户界面的完全控制,并且使用默认 RCL,等下参考2.2。      

  

  2.1 使用Scaffold Identity 授权到MVC 项目

      1.从解决方案资源管理器,右键单击该项目 >添加 > 新基架项。

      2.从左窗格添加基架对话框中,选择标识 > 添加。

      3.在中ADD 标识添加对话框中,选择所需的选项。

    下面使用现有的数据上下文,选择所有文件,以便后面重写,如下所示。

    生成需要重写的文件后,如下所示(可以比对上图1.1的Areas目录),注意生成的是razor page 文件,不是MVC视图控制器。之前上面的疑惑解除了。

    

  2.2 创建完整的Identity UI 源

   上面2.1中运行Scaffold Identity,保持了对Identity UI的完全控制。以下突出显示的代码显示默认Identity UI 替换Identity在 ASP.NET Core 2.1 web 应用的更改。 需要执行此操作以具有完全控制权限的Identity  UI。

    public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
}); services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection"))); services.AddIdentity<IdentityUser, IdentityRole>()
//services.AddDefaultIdentity<IdentityUser>()
.AddDefaultUI(UIFramework.Bootstrap4)
.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 = ;
options.Password.RequiredUniqueChars = ; // Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes();
options.Lockout.MaxFailedAccessAttempts = ;
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.AccessDeniedPath = "/Identity/Account/AccessDenied";
// options.SlidingExpiration = true;
//}); 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";
}); // services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddRazorPagesOptions(options =>
{
options.AllowAreas = true;
options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
});
}

    选择修改Login.cshtml文件,在里面随变加点标记xxxx, 运行显示成功,以后就可以自定义样式布局和扩展权限功能。

    

  参考文献

   ASP.NET Core 上的Identity简介

   ASP.NET Core 项目中的scaffold-identity

 

最新文章

  1. Bucket不为空,请检查该Bucket是否包含未删除的Object或者未成功的Multipart碎片
  2. Spring+SpringMvc+Mybatis框架集成搭建教程四(项目部署及测试)
  3. javascript高级编程3第三章:基本概念 本章内容 语法 数据类型 流控制语句 函数
  4. WinDbg调试.NET程序入门
  5. sap去除后缀0方法
  6. swift uiview弹出动画
  7. DRAM 内存介绍(一)
  8. Intent的属性介绍
  9. 基于visual Studio2013解决C语言竞赛题之0202坐标转换
  10. PV FV PMT
  11. posix信号量(sem_t)
  12. mybatis 的mapper配置文件sql语句中, 有时用到 大于, 小于等等
  13. 单片机stm32小白入门级学习路线“图”
  14. 8.1 GOF 设计模式:关于设计模式
  15. jquery中each中使用break和continue
  16. mysql执行流程
  17. VueRouter
  18. Redis 启动警告解决【转】
  19. appium+python自动化测试真机测试时报错“info: [debug] Error: Could not extract PIDs from ps output. PIDS: [], Procs: [&quot;bad pid &#39;uiautomator&#39;&quot;]”
  20. (4.20)SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧

热门文章

  1. JS判断页面加载是否完成
  2. Rafy 领域实体框架简介
  3. python中的类
  4. SOFA 源码分析 —— 服务引用过程
  5. Jenkins踩坑系列--你试过linux主机ssh登录windows,启动java进程吗,来试试吧
  6. Python测试远程端口连接时间
  7. 架构之高可用性(HA)集群(Keepalived)
  8. servlet什么时候被实例化?【转】
  9. 网络传输数据封装详解(IP,UDP,TCP)
  10. 基于Microsoft Graph打造自己的Timeline应用