ASP.NET Identity简介

Why Identity?

ASP.NET Identity wasdesigned to solve site membership requirements.

Reference: http://www.asp.net/identity

一、Advantageof ASP.Net Identity

微软在.NET Framework 4.5 中推出了ASP.NET Identity,它为ASP.NET 应用程序提供了一系列的API用来管理和维护用户,有以下优点:

易于集成:ASP.NET Identity 可以用在所有的 ASP.NET 框架上,例如 ASP.NET MVC, Web Forms,Web Pages,ASP.NET Web API

持久化:默认情况下,ASP.NET Identity将用户所有的数据存储在数据库中。ASP.NET Identity 使用 Entity Framework 实现其所有的检索和持久化机制。

通过Code First,你可以对数据库架构的完全控制,一些常见的任务例如改变表名称、改变主键数据类型等都可以很轻易地完成。

基于声明的:ASP.NET Identity 支持基于声明的身份验证,它使用一组"声明"来表示用户的身份标识。相对于"角色","声明"能使开发人员能够更好地描述用户的身份标识。"角色"本质上只是一个布尔类型(即"属于"或"不属于"特定角色),而一个"声明"可以包含更多关于用户标识和成员资格的信息。

二、ASP.NETIdentity主要组成部分

ApplicationUser和ApplicationDbContext分别继承自己Microsoft.AspNet.Identity.EntityFramework的IdentityUser和IdentityDbContext。但与用户相关的操作实际上是通过Microsoft.AspNet.Identity.Core的 UserManager类来完成的,而UserManager的所有操作最终是由UserStore实现。

三、传统ASP.NET身份验证方式

安全问题一直是ASP.NET的关注点。其中,Windows验证和表单验证(Forms Authentication)就是ASP.NET两种主要的安全机制。

Windows验证:一般用于局域网应用。使用Windows验证时,用户的Windows安全令牌在用户访问整个网站期间使用HTTP请求,进行消息发送。应用程序会使用这个令牌在本地(或者域)里验证用户账号的有效性,也会评估用户所在角色所具备的权限。当用户验证失败或者未授权时,浏览器就会定向到特定的页面让用户输入自己的安全凭证(用户名和密码)。

Forms验证:Windows验证的局限性非常明显,一旦用户有超出本地域控制器范围的外网用户访问网站,就会出现问题。ASP.NET表单验证(Forms Authentication)很好的弥补了这一缺陷。使用表单验证,ASP.NET需要验证加密的HTTP cookie或者查询字符串来识别用户的所有请求。cookie与ASP.NET会话机制(session)的关系密切,在会话超时或者用户关闭浏览器之后,会话和cookie就会失效,用户需要重新登录网站建立新的会话。

四、ASP.NETIdentity验证的原理

讲到Identity的验证方式就绕不过Claims的认证方式,Claims认证最大的好处就是简单的隔离了验证(Authentication)和授权(Authorization)两个部分,但这也是它最大的优势。

.NET下Claims-based认证的主要由ClaimsIdentity以及ClaimsPrincipal这两个类组成,ClaimsIdentity可以理解为携带用户信息的证书,而ClaimsPrincipal可以理解为应用颁发的令牌,当然,认证机构可以是应用本身,也可以是实现Owin(OpenWeb Interface for .NET)方式的第三方认证。

来源:http://blog.csdn.net/MosMovon/article/details/50630390

ASP.NET Identity 使用简介

2017-04-06 15:55 32人阅读 评论(0) 收藏 举报

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

1. 什么是 ASP.NET Identity

ASP.NET Identity 是微软推出,用于在ASP.Net应用中管理用户的组件。

The mainstay for user management in recent years has been ASP.NET Membership, which has suffered from design choices. The biggest limitation is that the schema used to store the data worked only with SQL Server and was difficult to extend without re-implementing a lot of provider classes. The schema itself was overly complex, which made it harder to implement changes than it should have been.

--Pro ASP.NET MVC 5 Platform

2. 如何配置ASP.NET Identity with MySQL

2.1 配置ASP.NET Identity

2.1.1 安装相应的组件包

Microsoft.AspNet.Identity.EntityFramework

Microsoft.AspNet.Identity.OWIN

Microsoft.Owin.Host.SystemWeb

2.1.2 自定义核心组件

$ User model

默认的user model是 IdentityUser(Microsoft.AspNet.Identity.EntityFramework)。这个类有12个内建的属性,如 Id、UserName、PasswordHash、Email等

一般,根据业务需求,我们需要其它额外的属性。我们可以创建一个继承自IdentityUser的自定义类,在这个自定义类中添加额外的属性。

[c#] view plain copy

  1. using Microsoft.AspNet.Identity.EntityFramework

  2. public class AppUser : IdentityUser {

  3. // 在这里添加额外的属性

  4. }

$ DB Context

一般我们需要改变Identity用到的数据库表的名称。默认的数据库表为:AspNetUsers、AspNetUserRoles、AspNetUserLogins、AspNetUserCliams、AspNetRoles。

[c#] view plain copy

  1. using System.Data.Entity;

  2. using Microsoft.Asp.Net.Identity.EntityFramework;

  3. public class AppIdentityDbContext : IdentityDbContext<AppUser> {

  4. public AppIdentityDbContext() : base("IdentityDb") { }

  5. public AppIdentityDbContext(string connectionString)

  6. : base(connectionString) {

  7. }

  8. protected override void OnModelCreating(DbModelBuilder modelBuilder {

  9. base.OnModelCreating(modelBuilder);

  10. modelBuilder.Entity<AppUser>().ToTable("user");

  11. modelBuilder.Entity<IdentityRole>().ToTable("role");

  12. modelBuilder.Entity<IdentityUserRole>().ToTable("userrole");

  13. modelBuilder.Entity<IdentityUserClaim>().ToTable("userclaim");

  14. modelBuilder.Entity<IdentituUserLogin>().ToTable("userlogin");

  15. }

  16. }

$ DB 初始化

如果你不熟悉Identity的数据库表的结构,可以通过代码让Identity自动创建。

如果你比较熟悉,那我推荐用专业的数据库管理工具来创建,如MySQL Workbench。

代码示例。一般初始化代码只需要执行一次,好好斟酌策略,防止数据被删。

[c#] view plain copy

  1. using System.Data.Entity;

  2. public class AppIdentityDbContext : IdentityDbContext<AppUser> {

  3. ...

  4. static AppIdentityDbContext() {

  5. Database.SetInitializer<AppIdentityDbContext>(new IdentityDbInit());

  6. }

  7. }

[c#] view plain copy

  1. using System.Data.Entity;

  2. using Microsoft.AspNet.Identity;

  3. using Microsoft.AspNet.Identity.EntityFramework;

  4. public class IdentityDbInit : DropCreateDatabaseAlways<AppIdentityDbContext> {

  5. protectedd override void Seed(AppIdentityDbContext context) {

  6. this.InitAdmin(context);

  7. base.Seed(context);

  8. }

  9. public void InitAdmin(AppIdentityDbContext context) {

  10. string adminName = "admin";

  11. string adminPassword = "changeme";

  12. string adminRoleName = "Administrators";

  13. // 创建用户

  14. UserManager<AppUser> userManager = new UserManager<AppUser>(

  15. new UserStore<AppUser>(context));

  16. var user = new AppUser { UserName = adminName };

  17. userManager.Create(user, adminPassword);

  18. // 创建角色

  19. RoleManager<IdentityRole> roleManager = new RoleManager<IdentityRole>(

  20. new RoleStore<IdentityRole>(context));

  21. var adminRole = roleManager.Create(new IdentityRole(adminRoleName));

  22. // 给用户赋予角色

  23. userManager.AddToRole(user.Id, adminRoleName);

  24. }

  25. }

$ 配置

[c#] view plain copy

  1. using Microsoft.AspNet.Identity;

  2. using Microsoft.AspNet.Identity.EntityFramework;

  3. using Microsoft.AspNet.Identity.Owin;

  4. using Microsoft.Owin;

  5. using Microsoft.Owin.Security.Cookies;

  6. using Owin;

  7. public class IdentityConfig {

  8. public void Configuration(IAppBuilder app) {

  9. app.CreatePerOwinContext<AppIdentityDbContext>(() => new AppIdentityDbContext());

  10. app.CreatePerOwinContext<UserManager<AppUser>>(

  11. (o, c) => new UserManager<AppUser>(new UserStore<AppUser>(

  12. c.Get<AppIdentityDbContext>())));

  13. app.CreatePerOwinContext<RoleManager<IdentityRole>>(

  14. (o, c) => new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(

  15. c.Get<AppIdentityDbContext>())));

  16. app.UseCookieAuthentication(new CookieAuthenticationOptions {

  17. AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,

  18. LoginPath = new PathString("/Account/Login")

  19. });

  20. }

  21. }

2.1.3 配置web.config

[xml] view plain copy

  1. <configuration>

  2. <appSettings>

  3. <add key="owin:AppStartup" value="IdentityConfig" />

  4. ...

  5. </appSettings>

  6. ...

  7. </configuration>

2.2 配置MySQL DB

2.2.1 安装相应的组件包

MySql.Data.Entity

2.2.2 配置web.config

[xml] view plain copy

  1. <configuration>

  2. <configSections>

  3. <section name="entityFramework"

  4. type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework">

  5. </configSections>

  6. <system.data>

  7. <DbProviderFactories>

  8. <remove invariant="MySql.Data.MySqlClient" />

  9. <add name="MySQL Data Provider"

  10. invariant="MySql.Data.MySqlClient"

  11. description=".Net Framework Data Provider for MySQL"

  12. type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" />

  13. </DbProviderFactories>

  14. </system.data>

  15. <connectionStrings>

  16. <add name="IdentityDb"

  17. connectionString="server=192.168.0.9;user id=tester;password=changeme;database=IdentityDb"

  18. providerName="MySql.Data.MySqlClient" />

  19. </connectionStrings>

  20. <entityFramework>

  21. <providers>

  22. <provider invariantName="MySql.Data.MySqlClient"

  23. type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />

  24. </providers>

  25. </entityFramework>

  26. </configuration>

2.2.3 创建DB

方法一:创建一个没有表的空DB,通过代码让Identity自动创建表。(见上文)

方法二:创建一个带有所有Identity相关表的DB

$ User

[sql] view plain copy

  1. CREATE TABLE `user` (

  2. `Id` varchar(128) NOT NULL,

  3. `Email` varchar(256) DEFAULT NULL,

  4. `EmailConfirmed` tinyint(1) NOT NULL,

  5. `PasswordHash` longtext,

  6. `SecurityStamp` longtext,

  7. `PhoneNumber` longtext,

  8. `PhoneNumberConfirmed` tinyint(1) NOT NULL,

  9. `TwoFactorEnabled` tinyint(1) NOT NULL,

  10. `LockoutEndDateUtc` datetime DEFAULT NULL,

  11. `LockoutEnabled` tinyint(1) NOT NULL,

  12. `AccessFailedCount` int(11) NOT NULL,

  13. `UserName` varchar(256) NOT NULL,

  14. PRIMARY KEY (`Id`)

  15. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

$ Role

[c#] view plain copy

  1. CREATE TABLE `role` (

  2. `Id` varchar(128) NOT NULL,

  3. `Name` varchar(256) NOT NULL,

  4. PRIMARY KEY (`Id`)

  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

$ UserRole

[sql] view plain copy

  1. CREATE TABLE `userrole` (

  2. `UserId` varchar(128) NOT NULL,

  3. `RoleId` varchar(128) NOT NULL,

  4. PRIMARY KEY (`UserId`,`RoleId`),

  5. KEY `IdentityRole_Users` (`RoleId`),

  6. CONSTRAINT `AppUser_Roles` FOREIGN KEY (`UserId`) REFERENCES `user` (`Id`)

  7. ON DELETE CASCADE ON UPDATE NO ACTION,

  8. CONSTRAINT `IdentityRole_Users` FOREIGN KEY (`RoleId`) REFERENCES `role` (`Id`)

  9. ON DELETE CASCADE ON UPDATE NO ACTION

  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

$ UserClaim

[sql] view plain copy

  1. CREATE TABLE `userclaim` (

  2. `Id` int(11) NOT NULL AUTO_INCREMENT,

  3. `UserId` varchar(128) NOT NULL,

  4. `ClaimType` longtext,

  5. `ClaimValue` longtext,

  6. PRIMARY KEY (`Id`),

  7. UNIQUE KEY `Id` (`Id`),

  8. KEY `UserId` (`UserId`),

  9. CONSTRAINT `AppUser_Claims` FOREIGN KEY (`UserId`) REFERENCES `user` (`Id`)

  10. ON DELETE CASCADE ON UPDATE NO ACTION

  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

$ UserLogin

[sql] view plain copy

  1. CREATE TABLE `userlogin` (

  2. `LoginProvider` varchar(128) NOT NULL,

  3. `ProviderKey` varchar(128) NOT NULL,

  4. `UserId` varchar(128) NOT NULL,

  5. PRIMARY KEY (`LoginProvider`,`ProviderKey`,`UserId`),

  6. KEY `AppUser_Logins` (`UserId`),

  7. CONSTRAINT `AppUser_Logins` FOREIGN KEY (`UserId`) REFERENCES `user` (`Id`)

  8. ON DELETE CASCADE ON UPDATE NO ACTION

  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

3. 如何使用ASP.NET Identity

3.1 认证(Authenticate)

[c#] view plain copy

  1. using System.Security.Claims;

  2. using System.Web;

  3. using System.Web.Mvc;

  4. using Microsoft.AspNet.Identity;

  5. using Microsoft.AspNet.Identity.Owin;

  6. public class AccountController : Controller {

  7. [HttpPost]

  8. [AllowAnonymous]

  9. [ValidateAntiForgeryToken]

  10. public ActionResult Login(string name, string password, string returnUrl) {

  11. var userManager = HttpContext.GetOwinContext()

  12. .GetUserManager<UserManager<AppUser>>();

  13. var authManager = HttpContext.GetOwinContext().Authentication;

  14. var user = userManager.Find(name, password);

  15. if (user == null) {

  16. // Invalid name or password

  17. }

  18. else {

  19. ClaimsIdentity identity = userManager.CreateIdentity(

  20. user, DefaultAuthenticationTypes.ApplicationCookie);

  21. authManager.SignOut();

  22. authManager.SignIn(identity);

  23. return Redirect(returnUrl);

  24. }

  25. return View();

  26. }

  27. }

3.2 用户操作

[c#] view plain copy

  1. using System.Security.Principal;

  2. using System.Web;

  3. using Microsoft.AspNet.Identity;

  4. using Microsoft.AspNet.Identity.Owin;

  5. var userManager = HttpContext.Current.GetOwinContext()

  6. .GetUserManager<UserManager<AppUser>>();

  7. // 获取当前用户

  8. IPrincipal principal = HttpContext.Current.User;

  9. AppUser user = userManager.FindByName(principal.Identity.Name);

  10. // 创建用户

  11. var newUser = new AppUser { UserName = "Alice" };

  12. varr password = "changeme";

  13. userManager.Create(newUser, password);

  14. // 删除用户

  15. userManager.Delete(user);

  16. // 修改用户信息

  17. user.Email = "huangc126@126.com";

  18. user.PasswordHash = userManager.PasswordHasher.HashPassword("secret");

3.3 角色管理

[c#] view plain copy

  1. using System.Web;

  2. using Microsoft.AspNet.Identity;

  3. using Microsoft.AspNet.Identity.EntityFramework;

  4. using Microsoft.AspNet.Identity.Owin;

  5. var roleManager = HttpContext.Current.GetOwinContext()

  6. .GetUserManager<RoleManager<IdentityRole>>();

  7. // 创建角色

  8. var newRole = new IdentityRole { Name = "Admin" };

  9. roleManager.Create(newRole);

  10. // 将角色授予用户

  11. userManager.AddToRole(userId, role: "Admin");

  12. // 移除用户的角色

  13. userManager.RemoveFromRole(userId, role: "Admin");

  14. // 删除角色

  15. var role = roleManager.FindByName("Admin");

  16. roleManager.Delete(role);

3.4 授权(Authorization)

3.4.1 基于角色的授权

[c#] view plain copy

  1. using System.Web.Mv;

  2. [Authorize(Roles = "Administrators")]

  3. public class AdminController : Controller {

  4. ...

  5. }

3.4.2 基于声明(Claim)的授权

[c#] view plain copy

  1. using System.Security.Claims;

  2. using System.Web;

  3. using System.Web.Mvc;

  4. [ClaimsAccess(Issuer = "RemoteClaims", ClaimType = ClaimTypes.PostalCode, Value = "123456")]

  5. public ActionResult Action() {

  6. ...

  7. }

  8. public class ClaimsAccessAttribute : AuthorizeAttribute {

  9. public string Issuer { get; set; }

  10. public string ClaimType { get; set; }

  11. public string Value { get; set; }

  12. protected override bool AuthorizeCore(HttpContextBase context) {

  13. return context.User.Identity.IsAuthenticated

  14. && context.User.Identity is ClaimsIdentity

  15. && ((ClaimnsIdentity)context.User.Identity).HasClaim(

  16. c => c.Issuer == this.Issuer

  17. && c.Type == this.ClaimType

  18. && c.Value == this.Value);

  19. }

  20. }

4. 小结

ASP.NET Identity非常灵活,支持各种扩展,对中小型系统来说足够用了。虽然看上去有点麻烦,但即使是小系统,我也建议用Identity。因为自己去搞一套太麻烦,又容易出错。我们应该把更多的精力花在业务实现上,而不是去抠底层技术细节

来源:http://blog.csdn.net/hchaoh/article/details/69390918

ASP.NET Identity简介及简单使用相关推荐

  1. ASP.NET Identity简介

    Why Identity? ASP.NET Identity wasdesigned to solve site membership requirements. Reference: http:// ...

  2. ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core Identity 迁移数据 - ASP.NET C ...

  3. ASP.NET Identity 使用简介

    1. 什么是 ASP.NET Identity ASP.NET Identity 是微软推出,用于在ASP.NET应用中管理用户的组件. The mainstay for user managemen ...

  4. [转]Membership 到 .NET4.5 之 ASP.NET Identity

    本文转自:http://www.cnblogs.com/jesse2013/p/membership-part3.html 我们前面已经讨论过了如何在一个网站中集成最基本的Membership功能,然 ...

  5. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单 ...

  6. MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN

    在Membership系列的最后一篇引入了ASP.NET Identity,看到大家对它还是挺感兴趣的,于是来一篇详解登录原理的文章.本文会涉及到Claims-based(基于声明)的认证,我们会详细 ...

  7. 全新的membership框架Asp.net Identity(1)——.Net membership的历史

    在Asp.net上,微软的membershop框架经历了Asp.net membership到Asp.net simple membership,再到现在的Asp.net Identity. 每一次改 ...

  8. ASP.NET Core 项目配置 ( Startup ) - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core 项目配置 ( Startup ) - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core 项目配置 ( Startup ) - ASP ...

  9. ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 用户注册 上一章节我们终于迁移完了 Identity 的数据,也创建 ...

最新文章

  1. 在耗时操作结束之前 销毁tableView 如何让tableViewCell 销毁
  2. apatedns unhandled exception
  3. DM达梦创建表空间用户
  4. oracle创建用户及授权等相关操作
  5. Chrome TTFB中英文解释
  6. feign直接走熔断_SpringCloud基于OpenFeign实现服务熔断降级
  7. struts 标签导入
  8. Netty4.0学习笔记系列之五:自定义通讯协议
  9. 信贷违约风险预测(一)样本数据
  10. 微PE启动盘重装Windows 系统
  11. MWC-电机、电池螺旋桨搭配
  12. 《Linux运维总结:SVN提示Node remains in conflict解决办法》
  13. Learning C++ No.14【STL No.4】
  14. 刘津:职业生涯的前一半是靠努力,后一半是靠创新
  15. mate 10android o主题,华为Mate 10 Pro体验:这才是全面屏手机该有的样子
  16. (20200208已解决)PyCharm中Tab键无效
  17. 你是开发工程师、程序员还是码农?
  18. Stateful Firewall和SPI(stateful packet inspection) Firewall介绍
  19. HTML简单入门 代码加注释详解
  20. python编程软件排行榜_python编程软件

热门文章

  1. Amazon Elastic Beanstalk教程–最终指南(PDF下载)
  2. 【Excel VBA】轻松搞定数字、文本单元格格式错乱问题
  3. PHPer的进阶-Swoole网络和未来
  4. 普联软件上班一周感受
  5. 自动控制理论(5)——二阶系统的时域分析
  6. python与新媒体专业就业前景_新媒体行业的发展前景如何?
  7. for循环输出(倒)金字塔,(空心)菱形,(空心)沙漏
  8. php java session共享_PHP通过session id 实现session共享和登录验证的代码
  9. 如何对付gmon.out
  10. Chapter1-运动