[Solution] ASP.NET Identity(2) 空的项目使用
在本节中,我将说明将ASP.NET Identity添加到现有的项目或者一个空项目。我将介绍你需要添加的Nuget和Class。此示例中,会使用LocalDB。
本节目录:
注册用户涉及到的EF和Identity.Core 2个程序集。
新建项目
新建1个MVC项目或者一个空的WebForm项目都可以,在这里我使用MVC5(with no authentication)。
添加Nuget
包名:Microsoft.AspNet.Identity.EntityFramework
(它会同时引用EntityFramework和Microsoft.AspNet.Identity.Core2个包)
新建控制器
新建一个Account控制器用来管理用户登入登出注册等用户管理功能。
using System.Linq; using EmptyMVC.Models.Account; using System.Web.Mvc; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.EntityFramework; namespace EmptyMVC.Controllers { public class AccountController : Controller { // // GET: /Account/ public ActionResult Register() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Register(RegisterModel model) { if (ModelState.IsValid) { // UserStore 默认构造函数会使用默认连接字符串: DefaultConnection var userStore = new UserStore<IdentityUser>(); var manager = new UserManager<IdentityUser>(userStore); var user = new IdentityUser() { UserName = model.Name }; var result = manager.Create(user, model.Pwd); if (result.Succeeded) { return Content(user.UserName + "创建成功,id:" + user.Id); } var erro = result.Errors.FirstOrDefault(); ModelState.AddModelError("",erro); } return View(model); } } }
在这里需要引入一个ViewModel
using System.ComponentModel.DataAnnotations; namespace EmptyMVC.Models.Account { public class RegisterModel { [Required] [Display(Name = "用户名")] public string Name { get; set; } [Required] [StringLength(100, ErrorMessage = "{0} 必须至少包含 {2} 个字符。", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "密码")] public string Pwd { get; set; } [DataType(DataType.Password)] [Display(Name = "确认密码")] [Compare("Pwd", ErrorMessage = "密码和确认密码不匹配。")] public string ConfirmPwd { get; set; } } }
连接字符串
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\MVCIdentity.mdf;Initial Catalog=MVCIdentity;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>
创建视图
可以通过MVC自动生成。本质是一个创建页面。
以下是通过生成后的razor视图稍微修改2处显示字符串而成
@model EmptyMVC.Models.Account.RegisterModel @{ ViewBag.Title = "Register"; } <h2>Register</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>RegisterModel</h4> <hr /> @Html.ValidationSummary(true) <div class="form-group"> @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Pwd, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Pwd) @Html.ValidationMessageFor(model => model.Pwd) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.ConfirmPwd, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.ConfirmPwd) @Html.ValidationMessageFor(model => model.ConfirmPwd) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="注册" class="btn btn-default" /> </div> </div> </div> } <div> @Html.ActionLink("回到首页", "Index") </div> @section Scripts { @Scripts.Render("~/bundles/jqueryval") }
注意:这里最后通过scripts节点在模板页中插入绑定的jqueryval,是用来在客户端验证Model的,一般需要在Nuget下引用Validate包后,在BundleConfig下需要再绑定一下才可以使用。
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include("~/Scripts/jquery.validate*"));
开始注册
填写注册信息
注册成功!
在数据库里:
现在,我将展示如何登入用户,ASP.NET Identity使用OWIN作为身份验证。
Nuget搜索下载
a.Identity.Owin(OWIN核心)
b.Microsoft.Owin.Host.SystemWeb(for OWIN app run on iis)
添加OWIN Startup文件
配置(添加红色区域)
using Microsoft.AspNet.Identity; using Microsoft.Owin; using Microsoft.Owin.Security.Cookies; using Owin; [assembly: OwinStartup(typeof(EmptyMVC.Startup))] namespace EmptyMVC { public class Startup { public void Configuration(IAppBuilder app) { // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888 app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login") }); } } }
添加登入登出方法
using System.Linq; using System.Web; using EmptyMVC.Models.Account; using System.Web.Mvc; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.EntityFramework; using Microsoft.Owin.Security; namespace EmptyMVC.Controllers { public class AccountController : Controller { public ActionResult Index() { return View(User); } public ActionResult LogOff() { var authenticationManager = HttpContext.GetOwinContext().Authentication; authenticationManager.SignOut(); return Redirect("Login"); } public ActionResult Login() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Login(LoginModel model) { if (ModelState.IsValid) { var userStore = new UserStore<IdentityUser>(); var userManager = new UserManager<IdentityUser>(userStore); var user = userManager.Find(model.Name, model.Pwd); if (user != null) { var authenticationManager = HttpContext.GetOwinContext().Authentication; var userIdentity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie); authenticationManager.SignIn(userIdentity); return LoginRedirect(); } } return View(model); } // // GET: /Account/ public ActionResult Register() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Register(RegisterModel model) { if (ModelState.IsValid) { // UserStore 默认构造函数会使用默认连接字符串: DefaultConnection var userStore = new UserStore<IdentityUser>(); var manager = new UserManager<IdentityUser>(userStore); var user = new IdentityUser() { UserName = model.Name }; var result = manager.Create(user, model.Pwd); if (result.Succeeded) { var authenticationManager = HttpContext.GetOwinContext().Authentication; var userIdentity = manager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie); authenticationManager.SignIn(new AuthenticationProperties() { }, userIdentity); return LoginRedirect(); } var erro = result.Errors.FirstOrDefault(); ModelState.AddModelError("", erro); } return View(model); } private ActionResult LoginRedirect() { var url = HttpContext.Request["returnurl"]; if (string.IsNullOrEmpty(url)) return Redirect(Url.Action("Index")); return Redirect(url); } } }
这里需要一个LoginModel
public class LoginModel { [Required] [Display(Name = "用户名")] public string Name { get; set; } [Required] [StringLength(100, ErrorMessage = "{0} 必须至少包含 {2} 个字符。", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "密码")] public string Pwd { get; set; } }
添加View
Login
@model EmptyMVC.Models.Account.LoginModel @{ ViewBag.Title = "Login"; } <h2>Login</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>LoginModel</h4> <hr /> @Html.ValidationSummary(true) <div class="form-group"> @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Pwd, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Pwd) @Html.ValidationMessageFor(model => model.Pwd) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="登录" class="btn btn-default" /> </div> </div> </div> } <div> @Html.ActionLink("回到首页", "Index") </div> @section Scripts { @Scripts.Render("~/bundles/jqueryval") }
Index
@using Microsoft.AspNet.Identity @model System.Security.Principal.IPrincipal @{ ViewBag.Title = "Index"; } <h2>Index</h2> @if (Model.Identity.IsAuthenticated) { <h3>Hello @Model.Identity.GetUserName() !</h3> using (Html.BeginForm("LogOff","Account")) { Html.AntiForgeryToken(); <input type="submit" value="退出"/> } } else { <ul class="nav navbar-nav navbar-right"> <li>@Html.ActionLink("注册", "Register", "Account", routeValues: null, htmlAttributes: new { id = "registerLink" })</li> <li>@Html.ActionLink("登录", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })</li> </ul> }
开始登录
填写登录信息,点击登录
登录成功(点击退出,即可登出用户)
本文作者:Never、C
本文链接:http://www.cnblogs.com/neverc/p/4730439.html