你的位置:首页 > ASP.net教程

[ASP.net教程][Solution] ASP.NET Identity 空的项目使用


 

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

本节目录:

  • 注册用户
  • 登入登出

 

注册用户

注册用户涉及到的EF和Identity.Core 2个程序集。

 

新建项目

新建1个MVC项目或者一个空的WebForm项目都可以,在这里我使用MVC5(with no authentication)。

 

添加Nuget

包名:Microsoft.AspNet.Identity.EntityFramework

(它会同时引用EntityFrameworkMicrosoft.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);    }  }}

AccountController

这里需要一个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