[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

(它会同时引用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

原文地址:https://www.cnblogs.com/neverc/p/4730439.html