Identiry2是微软推出的Identity的升级版本,较之上一个版本更加易于扩展,总之更好用。如果需要具体细节。网上具体参考Identity2源代码下载 参考文章 在项目中,是不太想直接把这一堆堆的东西直接放到我们项目中的,我的做法是单独建立一个解决方案,方便以后懒得写代码,类似的可以使用解决方案稍微改改代码就完事。以下的代码均是参考或者直接复制Identity2给的简单示例而来,所以有需要的童鞋可以使用Nuget下载一个演示版本,自己参考代码达到自己的要求。Identity Samples


ASP.NET Identity 2集成到MVC5项目--笔记01

ASP.NET Identity 2集成到MVC5项目--笔记02


1.目标

  • 扩展用户字段
  • 扩展角色字段
  • 使用用户名、邮箱登陆
  • 注册后邮件注册登陆
  • ···

2.基础结构搭建

2.1网站结构搭建

(1)建立一个名为Identity2Study的MVC5项目,身份验证选择空

(2) 新建一个解决方案并且命名为Mvc.Identity

(3)在解决方案下建立两个文件夹分别命名为DAL 和BLL



(4)Nuget下载相关组件

首先下载Identity EntityFramework 2.1.0 下载这个之后Nuget会根据依赖自动帮我们下载Identity Core

PM> Install-Package Microsoft.AspNet.Identity.Core -Version 2.1.0-alpha1 -Pre

还需要下载 Identity Owin 2.1.0

PM> Install-Package Microsoft.AspNet.Identity.Owin -Version 2.1.0-alpha1 -Pre

下载Optimization

Install-Package Microsoft.AspNet.Web.Optimization

下载 Microsoft.Owin.Host.SystemWeb

PM> Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0

这里用命令行下载的时候需要注意:默认项目需要的是Mvc.Identity,如图:

2.2 扩展用户属性

在DAL文件夹中添加如下类(继承至IdentityUser),例如我们用户里面需要扩展一个字段用于存储用户的头像URL地址。

public class ApplicationUser : IdentityUser
{
//在这个类扩展自定义字段
/// <summary>
/// 头像URL
/// </summary>
public string headImage { get; set; } //添加一个方法 后面会用到
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
return userIdentity;
}
}

2.3 扩展角色属性

在DAL文件夹中添加如下类ApplicationRole(继承至IdentityRole),我们添加一个字段用于描述当前角色的含义。

  public class ApplicationRole : IdentityRole
{
public ApplicationRole() : base() { }
public ApplicationRole(string name) : base(name) { } /// <summary>
/// 角色描述
/// </summary>
[DisplayName("角色描述")]
public string Description { get; set; }
}

2.4 数据持久化(数据库上下文)

我们使用的Identity是基于EF框架的CodeFirst来完成数据持久保存的。所以需要添加数据库上下文。在DAL文件夹添加如下类ApplicationDbContext(继承至IdentityDbContext)

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
} static ApplicationDbContext()
{
//Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
} public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
} }

2.5 用户管理业务逻辑实现

在BLL文件夹下添加如下类ApplicationUserManager(继承至UserManager)封装了一些方法比如创建用户

public class ApplicationUserManager : UserManager<ApplicationUser>
{
public ApplicationUserManager(IUserStore<ApplicationUser> store)
: base(store)
{
} public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options,
IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
// Configure user lockout defaults
manager.UserLockoutEnabledByDefault = true;
manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
manager.MaxFailedAccessAttemptsBeforeLockout = 5;
// Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
// You can write your own provider and plug in here.
manager.RegisterTwoFactorProvider("PhoneCode", new PhoneNumberTokenProvider<ApplicationUser>
{
MessageFormat = "Your security code is: {0}"
});
manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider<ApplicationUser>
{
Subject = "SecurityCode",
BodyFormat = "Your security code is {0}"
});
//manager.EmailService = new EmailService();
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider =
new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
}
return manager;
}
}

2.6 角色管理业务逻辑实现

在BLL文件夹下添加如下类ApplicationRoleManager(继承至RoleManager)

public class ApplicationRoleManager : RoleManager<ApplicationRole>
{
public ApplicationRoleManager(IRoleStore<ApplicationRole, string> roleStore)
: base(roleStore)
{
} public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
{
return new ApplicationRoleManager(new RoleStore<ApplicationRole>(context.Get<ApplicationDbContext>()));
}
}

2.7 登录业务逻辑实现

在BLL文件夹下添加如下类ApplicationSignInManager(继承至SignInManager<ApplicationUser, string>)

public class ApplicationSignInManager : SignInManager<ApplicationUser, string>
{
public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager) :
base(userManager, authenticationManager) { } public override Task<ClaimsIdentity> CreateUserIdentityAsync(ApplicationUser user)
{
return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager);
} public static ApplicationSignInManager Create(IdentityFactoryOptions<ApplicationSignInManager> options, IOwinContext context)
{
return new ApplicationSignInManager(context.GetUserManager<ApplicationUserManager>(), context.Authentication);
}
}

2.8 邮件发送业务逻辑实现

用于发送邮件,在BLL文件夹下面建立类EmailService(继承至IIdentityMessageService)

    public class EmailService : IIdentityMessageService
{
public Task SendAsync(IdentityMessage message)
{
var credentialUserName = "邮箱登录名";
var sentFrom = "你的邮箱地址";
var pwd = "邮箱登录密码"; System.Net.Mail.SmtpClient client =
new System.Net.Mail.SmtpClient("smtp服务器地址"); client.Port = 25;//smtp邮件服务器端口
client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false; System.Net.NetworkCredential credentials =
new System.Net.NetworkCredential(credentialUserName, pwd); client.EnableSsl = true;
client.Credentials = credentials; var mail =
new System.Net.Mail.MailMessage(sentFrom, message.Destination); mail.Subject = message.Subject;
mail.Body = message.Body;
return client.SendMailAsync(mail);
}
}

这个类添加完毕后需要我们在ApplicationUserManager类下面的create方法里面大概55行左右添加如下代码用于我们在新建用户的时候会收到一封确认注册的邮件

manager.EmailService = new EmailService();

2.9 添加默认账号和角色

在DAL文件夹下面的ApplicationDbContext.cs添加一个数据初始化策略类名为ApplicationDbInitializer(继承至DropCreateDatabaseIfModelChanges)

public class ApplicationDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>
{
protected override void Seed(ApplicationDbContext context)
{
InitializeIdentityForEF(context);
base.Seed(context);
} //Create User=Admin@Admin.com with password=Admin@123456 in the Admin role
public static void InitializeIdentityForEF(ApplicationDbContext db)
{
var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>();
const string name = "Admin@Admin.com";
const string password = "Admin@Admin123";
const string roleName = "Admin"; //Create Role Admin if it does not exist
var role = roleManager.FindByName(roleName);
if (role == null)
{
role = new ApplicationRole(roleName);
var roleresult = roleManager.Create(role);
} var user = userManager.FindByName(name);
if (user == null)
{
user = new ApplicationUser { UserName = name, Email = name };
var result = userManager.Create(user, password);
result = userManager.SetLockoutEnabled(user.Id, false);
} // Add user admin to Role Admin if not already added
var rolesForUser = userManager.GetRoles(user.Id);
if (!rolesForUser.Contains(role.Name))
{
var result = userManager.AddToRole(user.Id, role.Name);
}
}
}

建立完毕后记得把ApplicationDbContext类里面构造函数的初始化策略取消注释

Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());

如果允许到这里提示httpcontext未定义,则需要我们添加System.Web组件。自行在引用搜一下加到解决方案即可。

到这里,项目的大致结构搭建完成

这篇只是搭建一个大致的框架,下一篇才是想要的功能。


ASP.NET Identity 2集成到MVC5项目--笔记01的更多相关文章

  1. ASP.NET Identity 2集成到MVC5项目--笔记02

    ASP.NET Identity 2集成到MVC5项目--笔记01 ASP.NET Identity 2集成到MVC5项目--笔记02 继上一篇,本篇主要是实现邮件.用户名登陆和登陆前邮件认证. 1. ...

  2. ASP.NET MVC5学习笔记01

    由于之前在项目中也使用MVC进行开发,但是具体是那个版本就不是很清楚了,但是我觉得大体的思想是相同的,只是版本高的在版本低的基础上增加了一些更加方便操作的东西.下面是我学习ASP.NET MVC5高级 ...

  3. Java项目笔记01

    1 Tomcat问题 1 今天用了Ecplise和MyEcplise想着用同一个路径下的Tomcat,但是却发现配置完Ecplise后MyEcplise却不能用了,并且后面在bin里启动Tomcat还 ...

  4. [Solution] ASP.NET Identity(2) 空的项目使用

    在本节中,我将说明将ASP.NET Identity添加到现有的项目或者一个空项目.我将介绍你需要添加的Nuget和Class.此示例中,会使用LocalDB. 本节目录: 注册用户 登入登出 注册用 ...

  5. ASP.NET MVC 随想录——探索ASP.NET Identity 身份验证和基于角色的授权,中级篇

    在前一篇文章中,我介绍了ASP.NET Identity 基本API的运用并创建了若干用户账号.那么在本篇文章中,我将继续ASP.NET Identity 之旅,向您展示如何运用ASP.NET Ide ...

  6. ASP.NET Identity 身份验证和基于角色的授权

    ASP.NET Identity 身份验证和基于角色的授权 阅读目录 探索身份验证与授权 使用ASP.NET Identity 身份验证 使用角色进行授权 初始化数据,Seeding 数据库 小结 在 ...

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

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

  8. [转]MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN

    本文转自:http://www.cnblogs.com/jesse2013/p/aspnet-identity-claims-based-authentication-and-owin.html 在M ...

  9. MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN -摘自网络

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

随机推荐

  1. 严重: Dispatcher initialization failed java.lang.RuntimeException: java.lang.reflect.Invoc

    错误提示:严重: Dispatcher initialization failed java.lang.RuntimeException: java.lang.reflect.InvocationTa ...

  2. python-wechatAutoReword

    python-微信自动回复功能,基于itchat 2017.9.6 实现群@自动回复 #! /usr/bin/env python3.5.2 # coding="utf-8" im ...

  3. js 内存泄漏

    在javascript中,我们很少去关注内存的管理.我们创建变量,使用变量,浏览器关注这些底层的细节都显得很正常. 但是当应用程序变得越来越复杂并且ajax化之后,或者用户在一个页面停留过久,我们可能 ...

  4. ios界面跳转

    import Foundationimport UIKit class MyViewController: UIViewController{ // var window: UIWindow? ove ...

  5. cf339d Xenia and Bit Operations

    Xenia and Bit Operations Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  6. dp背包之01背包poj2184

    http://poj.org/problem?id=2184 题意:给定两个属性,求这两个属性的和的最大值......... 思路:将第一个属性往后平移1000个单位,然后推导其动态转移方程,若是dp ...

  7. xmapp+netbeans调试

    1.netbeans的设置 2.修改php.ini 如下: [XDebug]zend_extension = "D:\dev\xampp\php\ext\php_xdebug.dll&quo ...

  8. EmWebAdmin 初步上手

    EmWebAdmin 简介: // github 地址: https://github.com/ZengjfOS/EmWebAdmin // 介绍: 参考gentelella做的模板: 这是一个PHP ...

  9. xeno 实时性能测试 在100us的采样周期的测试数据

    1 xeno 用户层测试时间: root@sama5d3-linux:/usr/bin latency -t0 -T25 -p100== Sampling period: 100 us== Test ...

  10. Unix网络编程中的五种I/O模型_转

    转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描 ...