在本节中,我将说明将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(, ErrorMessage = "{0} 必须至少包含 {2} 个字符。", MinimumLength = )]
[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);
}
}
}
AccountController
这里需要一个LoginModel
public class LoginModel
{
[Required]
[Display(Name = "用户名")]
public string Name { get; set; } [Required]
[StringLength(, ErrorMessage = "{0} 必须至少包含 {2} 个字符。", MinimumLength = )]
[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