`

ASP.NET Identity 使用简介

 
阅读更多

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的自定义类,在这个自定义类中添加额外的属性。

using Microsoft.AspNet.Identity.EntityFramework

public class AppUser : IdentityUser {
    // 在这里添加额外的属性
}

 

$ DB Context

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

using System.Data.Entity;
using Microsoft.Asp.Net.Identity.EntityFramework;
public class AppIdentityDbContext : IdentityDbContext<AppUser> {
    public AppIdentityDbContext() : base("IdentityDb") { }
    public AppIdentityDbContext(string connectionString)
        : base(connectionString) {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<AppUser>().ToTable("user");
        modelBuilder.Entity<IdentityRole>().ToTable("role");
        modelBuilder.Entity<IdentityUserRole>().ToTable("userrole");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("userclaim");
        modelBuilder.Entity<IdentituUserLogin>().ToTable("userlogin");
    }
}

 

$ DB 初始化

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

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

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

using System.Data.Entity;
public class AppIdentityDbContext : IdentityDbContext<AppUser> {
    ...
    static AppIdentityDbContext() {
        Database.SetInitializer<AppIdentityDbContext>(new IdentityDbInit());
    }
}

 

using System.Data.Entity;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;

public class IdentityDbInit : DropCreateDatabaseAlways<AppIdentityDbContext> {
    protectedd override void Seed(AppIdentityDbContext context) {
        this.InitAdmin(context);
        base.Seed(context);
    }

    public void InitAdmin(AppIdentityDbContext context) {
        string adminName = "admin";
        string adminPassword = "changeme";
        string adminRoleName = "Administrators";

        // 创建用户
        UserManager<AppUser> userManager = new UserManager<AppUser>(
            new UserStore<AppUser>(context));
        var user = new AppUser { UserName = adminName };
        userManager.Create(user, adminPassword);

        // 创建角色
        RoleManager<IdentityRole> roleManager = new RoleManager<IdentityRole>(
            new RoleStore<IdentityRole>(context));
        var adminRole = roleManager.Create(new IdentityRole(adminRoleName));

        // 给用户赋予角色
        userManager.AddToRole(user.Id, adminRoleName);
    }
}

 

$ 配置

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using Owin;

public class IdentityConfig {
    public void Configuration(IAppBuilder app) {
        app.CreatePerOwinContext<AppIdentityDbContext>(() => new AppIdentityDbContext());
        app.CreatePerOwinContext<UserManager<AppUser>>(
            (o, c) => new UserManager<AppUser>(new UserStore<AppUser>(
                c.Get<AppIdentityDbContext>())));
        app.CreatePerOwinContext<RoleManager<IdentityRole>>(
            (o, c) => new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(
                c.Get<AppIdentityDbContext>())));

        app.UseCookieAuthentication(new CookieAuthenticationOptions {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });
    }
}

 

2.1.3 配置web.config

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

 

2.2 配置MySQL DB

2.2.1 安装相应的组件包

MySql.Data.Entity

 

2.2.2 配置web.config

 

<configuration>
  <configSections>
    <section name="entityFramework"
	         type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework">
  </configSections>
  <system.data>
    <DbProviderFactories>
	  <remove invariant="MySql.Data.MySqlClient" />
	  <add name="MySQL Data Provider"
	       invariant="MySql.Data.MySqlClient"
		   description=".Net Framework Data Provider for MySQL"
		   type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" />
	</DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="IdentityDb"
	     connectionString="server=192.168.0.9;user id=tester;password=changeme;database=IdentityDb"
		 providerName="MySql.Data.MySqlClient" />
  </connectionStrings>
  <entityFramework>
    <providers>
	  <provider invariantName="MySql.Data.MySqlClient"
	  type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
	</providers>
  </entityFramework>
</configuration>

 

2.2.3 创建DB

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

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

 

$ User


 

CREATE TABLE `user` (
  `Id` varchar(128) NOT NULL,
  `Email` varchar(256) DEFAULT NULL,
  `EmailConfirmed` tinyint(1) NOT NULL,
  `PasswordHash` longtext,
  `SecurityStamp` longtext,
  `PhoneNumber` longtext,
  `PhoneNumberConfirmed` tinyint(1) NOT NULL,
  `TwoFactorEnabled` tinyint(1) NOT NULL,
  `LockoutEndDateUtc` datetime DEFAULT NULL,
  `LockoutEnabled` tinyint(1) NOT NULL,
  `AccessFailedCount` int(11) NOT NULL,
  `UserName` varchar(256) NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

$ Role


 

CREATE TABLE `role` (
  `Id` varchar(128) NOT NULL,
  `Name` varchar(256) NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

$ UserRole


 

CREATE TABLE `userrole` (
  `UserId` varchar(128) NOT NULL,
  `RoleId` varchar(128) NOT NULL,
  PRIMARY KEY (`UserId`,`RoleId`),
  KEY `IdentityRole_Users` (`RoleId`),
  CONSTRAINT `AppUser_Roles` FOREIGN KEY (`UserId`) REFERENCES `user` (`Id`)
    ON DELETE CASCADE ON UPDATE NO ACTION,
  CONSTRAINT `IdentityRole_Users` FOREIGN KEY (`RoleId`) REFERENCES `role` (`Id`)
    ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

$ UserClaim


 

 

CREATE TABLE `userclaim` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `UserId` varchar(128) NOT NULL,
  `ClaimType` longtext,
  `ClaimValue` longtext,
  PRIMARY KEY (`Id`),
  UNIQUE KEY `Id` (`Id`),
  KEY `UserId` (`UserId`),
  CONSTRAINT `AppUser_Claims` FOREIGN KEY (`UserId`) REFERENCES `user` (`Id`)
    ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

$ UserLogin



 

CREATE TABLE `userlogin` (
  `LoginProvider` varchar(128) NOT NULL,
  `ProviderKey` varchar(128) NOT NULL,
  `UserId` varchar(128) NOT NULL,
  PRIMARY KEY (`LoginProvider`,`ProviderKey`,`UserId`),
  KEY `AppUser_Logins` (`UserId`),
  CONSTRAINT `AppUser_Logins` FOREIGN KEY (`UserId`) REFERENCES `user` (`Id`)
    ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 


 

3. 如何使用ASP.NET Identity

3.1 认证(Authenticate)

using System.Security.Claims;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

public class AccountController : Controller {
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(string name, string password, string returnUrl) {
        var userManager = HttpContext.GetOwinContext()
            .GetUserManager<UserManager<AppUser>>();
        var authManager = HttpContext.GetOwinContext().Authentication;
        var user = userManager.Find(name, password);
        if (user == null) {
            // Invalid name or password
        }
        else {
            ClaimsIdentity identity = userManager.CreateIdentity(
                user, DefaultAuthenticationTypes.ApplicationCookie);
            authManager.SignOut();
            authManager.SignIn(identity);
            return Redirect(returnUrl);
        }

        return View();
    }
}

 

3.2 用户操作

using System.Security.Principal;
using System.Web;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

var userManager = HttpContext.Current.GetOwinContext()
    .GetUserManager<UserManager<AppUser>>();

// 获取当前用户
IPrincipal principal = HttpContext.Current.User;
AppUser user = userManager.FindByName(principal.Identity.Name);

// 创建用户
var newUser = new AppUser { UserName = "Alice" };
varr password = "changeme";
userManager.Create(newUser, password);

// 删除用户
userManager.Delete(user);

// 修改用户信息
user.Email = "huangc126@126.com";
user.PasswordHash = userManager.PasswordHasher.HashPassword("secret");

 

3.3 角色管理

using System.Web;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity.Owin;

var roleManager = HttpContext.Current.GetOwinContext()
    .GetUserManager<RoleManager<IdentityRole>>();

// 创建角色
var newRole = new IdentityRole { Name = "Admin" };
roleManager.Create(newRole);

// 将角色授予用户
userManager.AddToRole(userId, role: "Admin");

// 移除用户的角色
userManager.RemoveFromRole(userId, role: "Admin");

// 删除角色
var role = roleManager.FindByName("Admin");
roleManager.Delete(role);

 

3.4 授权(Authorization)

3.4.1 基于角色的授权

using System.Web.Mv;

[Authorize(Roles = "Administrators")]
public class AdminController : Controller {
    ...
}

 

3.4.2 基于声明(Claim)的授权

using System.Security.Claims;
using System.Web;
using System.Web.Mvc;

[ClaimsAccess(Issuer = "RemoteClaims", ClaimType = ClaimTypes.PostalCode, Value = "123456")]
public ActionResult Action() {
    ...
}

public class ClaimsAccessAttribute : AuthorizeAttribute {
    public string Issuer { get; set; }
	public string ClaimType { get; set; }
	public string Value { get; set; }
	
	protected override bool AuthorizeCore(HttpContextBase context) {
	    return context.User.Identity.IsAuthenticated
		    && context.User.Identity is ClaimsIdentity
			&& ((ClaimnsIdentity)context.User.Identity).HasClaim(
			    c => c.Issuer == this.Issuer
				    && c.Type == this.ClaimType
					&& c.Value == this.Value);
	}
}

 

 

4. 小结

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

  • 大小: 14.7 KB
  • 大小: 5.5 KB
  • 大小: 4.9 KB
  • 大小: 6.6 KB
  • 大小: 5.6 KB
  • 大小: 24.6 KB
0
0
分享到:
评论

相关推荐

    ASP.NET Identity教程(中英文对照)

    本系列教程详细、完整、深入地介绍了微软的ASP.NET Identity技术,描述了如何运用ASP.NET Identity实现应用程序的用户管理,以及实现应用程序的认证与授权等相关技术,译者希望本系列教程能成为掌握ASP.NET Identity...

    asp.net identity 文档

    - **使用 ASP.NET Identity**: - **枚举用户账号**:列出所有已注册的用户。 - **创建用户**:实现新用户的注册功能。 - **验证口令**:校验用户输入的密码是否正确。 - **验证用户细节**:检查用户的详细信息...

    ASP.NET Identity Custom MySQL

    这个框架默认使用SQL Server数据库,但开发者可以根据需求将其自定义为使用MySQL数据库,这就是"ASP.NET Identity Custom MySQL"的主题。在本项目中,我们将探讨如何利用EntityFramework与MySQL数据库集成,以实现...

    ASP.NET Core Identity:构建安全且灵活的用户身份验证系统

    本文将深入探讨ASP.NET Core Identity的工作原理、关键组件以及如何在实际项目中进行配置和使用。 ASP.NET Core Identity是一个功能丰富、安全可靠的身份认证系统,它为开发者提供了一套完整的用户管理解决方案。...

    ASP.NET完整项目源代码

    5. **ASP.NET Identity**:对于用户认证和授权,项目可能使用了ASP.NET Identity系统,这是一个为现代Web应用设计的身份管理框架,支持OAuth、Facebook、Google等第三方登录。 6. **ASP.NET Core**:部分项目可能...

    ASP.NET Core Identity:构建安全的用户身份验证系统

    本文将详细介绍 ASP.NET Core Identity 的核心功能、使用方法以及实际应用示例。 ASP.NET Core Identity 是一个功能强大的身份验证和用户管理框架,能够帮助开发者轻松实现安全的用户身份验证系统。通过本文的介绍和...

    asp.net学习资料

    与ASP.NET结合使用,可以方便地实现数据持久化和业务逻辑。 七、Web API ASP.NET Web API是用于构建RESTful服务的框架,它支持JSON和XML格式的数据交换,适用于构建Web服务供其他应用或客户端调用。 八、Azure集成...

    ASP.NET-Identity-Samples:ASP.NET Identity 示例,包括 oAuth、两个因素、迁移等

    ASP.NET 身份示例ASP.NET Identity 示例,包括 oAuth、两个因素、迁移等这些演示与这里的课程一起使用 (尽管您不必观看它就可以从中获得一些东西) 在每个项目中,我都保留了相同的命名空间,并从“BasicTemplate -...

    ASP.NET-Identity-SQLite-EntityFramework:基于SQLite数据库和Entity Framework ORM的ASP.NET Identity成员资格的实现

    ASP.NET-Identity-SQLite-EntityFramework 基于SQLite数据库和Entity Framework OR/M实现ASP.NET Identity成员资格 基础信息 这是 ASP.NET Identity 成员身份与实体框架和 SQLite 数据库的实现。 出于我的目的,...

    asp.net入门经典

    7. ASP.NET Identity: ASP.NET Identity是ASP.NET中的身份验证和授权系统,用于管理用户注册、登录和其他安全相关任务。学习如何配置和使用Identity是建立安全Web应用的关键。 8. Web配置文件(Web.config): Web...

    Aspnet-ASP.NET-WebForm-Identity-Demo.zip

    Aspnet-ASP.NET-WebForm-Identity-Demo.zip,asp.net-webform-identity-demoasp.net-webform-identity-demo,asp.net是一个开源的web框架,用于使用.net构建现代web应用和服务。asp.net创建基于html5、css和javascript...

    asp.net迅捷网站

    在实际开发中,asp.net还可以与SQL Server、MySQL等数据库配合,使用AJAX技术提高用户体验,以及引入jQuery、Bootstrap等库优化前端表现。此外,asp.net还支持响应式设计,以适应不同设备的显示需求。 总之,"asp...

    asp.net MVC4 CMS

    ASP.NET MVC4 CMS可能使用ASP.NET Identity进行用户认证和授权。这包括注册、登录、密码重置等功能,并且可以集成OAuth、OpenID Connect等外部身份验证服务。 **模块化和插件架构**: 为了保持系统的可扩展性,CMS...

    asp.net课程资料

    了解如何配置和使用ASP.NET Identity是构建安全Web应用的关键。 6. **Web API** ASP.NET Web API是构建RESTful服务的框架,可以用于创建HTTP服务,供各种客户端(如浏览器、移动设备或桌面应用)使用。学习如何...

    ASP.NET学习资料

    ASP.NET是.NET生态的一部分,它允许开发者使用多种编程语言(如C#、VB.NET)来编写服务器端代码,创建动态网页。它支持多种Web应用模式,包括Web Forms、MVC(Model-View-Controller)和Web Pages。 2. **Web ...

    asp.net 实例 网站

    4. **ASP.NET Identity**:身份验证和授权是Web应用中必不可少的部分。ASP.NET Identity提供了一套完整的用户管理和认证系统,包括注册、登录、密码重置等功能,并支持与其他社交账号的集成。 5. **Entity ...

    简单的ASP.NET作品

    通过对这个简单的ASP.NET作品的分析,我们可以学习到如何使用ASP.NET框架搭建一个功能完善的网站,理解MVC模式的应用,以及后台管理系统的实现方式。同时,这也为我们提供了实践和学习.NET技术的机会。

    使用ASP.NET技术开发网上书店(ASP.NET)

    在本项目“使用ASP.NET技术开发网上书店”中,我们将深入探讨如何利用ASP.NET的核心特性来实现一个功能完备的在线图书销售平台。 首先,我们需要理解ASP.NET的MVC(Model-View-Controller)架构。MVC模式将应用程序...

    asp.net精品课程网站

    总的来说,"asp.net精品课程网站"项目涵盖了ASP.NET开发的多个关键知识点,包括但不限于MVC架构设计、Entity Framework数据库操作、ASP.NET Identity用户管理、前端开发技术以及源代码组织结构等。通过学习和分析这...

    ASP.NET动态网页设计案例教程

    理解如何配置和使用ASP.NET Identity对于创建安全的Web应用至关重要。 6. **ADO.NET与Entity Framework**:数据访问技术,如ADO.NET和Entity Framework,用于连接数据库并执行CRUD(创建、读取、更新、删除)操作。...

Global site tag (gtag.js) - Google Analytics