zoukankan      html  css  js  c++  java
  • [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

  • 相关阅读:
    微信小程序使用wxParse解析html
    git基本操作
    thinkphp 静态缓存设置
    phpstudy 安装memcached服务和memcache扩展
    CSS超出部分显示省略号…代码
    小程序支付
    phpstorm 快捷键2
    thinkphp session设置
    cookie与session
    微信小程序 setData动态设置数组中的数据
  • 原文地址:https://www.cnblogs.com/neverc/p/4730439.html
Copyright © 2011-2022 走看看