ASP.NET Identity简介及简单使用

C# 专栏收录该内容
255 篇文章 3 订阅

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 使用简介

 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.   

  3. public class AppUser : IdentityUser {  

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

  5. }  

 

$ 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.   

  9.     protected override void OnModelCreating(DbModelBuilder modelBuilder {  

  10.         base.OnModelCreating(modelBuilder);  

  11.   

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

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

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

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

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

  17.     }  

  18. }  

 

$ 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.   

  5. public class IdentityDbInit : DropCreateDatabaseAlways<AppIdentityDbContext> {  

  6.     protectedd override void Seed(AppIdentityDbContext context) {  

  7.         this.InitAdmin(context);  

  8.         base.Seed(context);  

  9.     }  

  10.   

  11.     public void InitAdmin(AppIdentityDbContext context) {  

  12.         string adminName = "admin";  

  13.         string adminPassword = "changeme";  

  14.         string adminRoleName = "Administrators";  

  15.   

  16.         // 创建用户  

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

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

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

  20.         userManager.Create(user, adminPassword);  

  21.   

  22.         // 创建角色  

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

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

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

  26.   

  27.         // 给用户赋予角色  

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

  29.     }  

  30. }  

 

$ 配置

[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.   

  8. public class IdentityConfig {  

  9.     public void Configuration(IAppBuilder app) {  

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

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

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

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

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

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

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

  17.   

  18.         app.UseCookieAuthentication(new CookieAuthenticationOptions {  

  19.             AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,  

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

  21.         });  

  22.     }  

  23. }  

 

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.   

  7. public class AccountController : Controller {  

  8.     [HttpPost]  

  9.     [AllowAnonymous]  

  10.     [ValidateAntiForgeryToken]  

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

  12.         var userManager = HttpContext.GetOwinContext()  

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

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

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

  16.         if (user == null) {  

  17.             // Invalid name or password  

  18.         }  

  19.         else {  

  20.             ClaimsIdentity identity = userManager.CreateIdentity(  

  21.                 user, DefaultAuthenticationTypes.ApplicationCookie);  

  22.             authManager.SignOut();  

  23.             authManager.SignIn(identity);  

  24.             return Redirect(returnUrl);  

  25.         }  

  26.   

  27.         return View();  

  28.     }  

  29. }  

 

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.   

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

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

  8.   

  9. // 获取当前用户  

  10. IPrincipal principal = HttpContext.Current.User;  

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

  12.   

  13. // 创建用户  

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

  15. varr password = "changeme";  

  16. userManager.Create(newUser, password);  

  17.   

  18. // 删除用户  

  19. userManager.Delete(user);  

  20.   

  21. // 修改用户信息  

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

  23. 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.   

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

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

  8.   

  9. // 创建角色  

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

  11. roleManager.Create(newRole);  

  12.   

  13. // 将角色授予用户  

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

  15.   

  16. // 移除用户的角色  

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

  18.   

  19. // 删除角色  

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

  21. roleManager.Delete(role);  

 

3.4 授权(Authorization)

3.4.1 基于角色的授权

[c#] view plain copy

  1. using System.Web.Mv;  

  2.   

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

  4. public class AdminController : Controller {  

  5.     ...  

  6. }  

 

3.4.2 基于声明(Claim)的授权

[c#] view plain copy

  1. using System.Security.Claims;  

  2. using System.Web;  

  3. using System.Web.Mvc;  

  4.   

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

  6. public ActionResult Action() {  

  7.     ...  

  8. }  

  9.   

  10. public class ClaimsAccessAttribute : AuthorizeAttribute {  

  11.     public string Issuer { getset; }  

  12.     public string ClaimType { getset; }  

  13.     public string Value { getset; }  

  14.       

  15.     protected override bool AuthorizeCore(HttpContextBase context) {  

  16.         return context.User.Identity.IsAuthenticated  

  17.             && context.User.Identity is ClaimsIdentity  

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

  19.                 c => c.Issuer == this.Issuer  

  20.                     && c.Type == this.ClaimType  

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

  22.     }  

  23. }  

 

 

4. 小结

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

来源:http://blog.csdn.net/hchaoh/article/details/69390918
  • 4
    点赞
  • 0
    评论
  • 9
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值