• Asp.Net MVC 5使用Identity之简单的注册和登陆


    由于.Net MVC 5登陆和注册方式有很多种,但是Identity方式去实现或许会更简单更容易理解

    首先新建一个项目

    其次如下选择Empty和MVC的选项

    然后打开NuGet包管理器分别安装几个包

    1. EntityFramework
    2. Microsoft.AspNet.Identity.Core
    3. Microsoft.AspNet.Identity.EntityFramework
    4. Microsoft.AspNet.Identity.Owin
    5. Modernizr
    6. Microsoft.Owin.Host.SystemWeb
    7. Bootstrap

    然后往Models文件夹里面添加ApplicationUser类,SignInModel类,SignUpModel类,ApplicationDbContext类,当然ApplicationDbContext类你也可以分到DbContext到另一个类库,我这是做演示用的,分层不用么这么明确

    ----------------------------------------------------------------------

    ApplicationUser类

    ApplicationDbContext类

    SignInModel类

    SignUpModel

    然后往App_Start文件夹里面添加ApplicationSignInManager类,ApplicationUserManager类,ApplicationUserStore类

    ---------------------------------------------------------------------

    ApplicationUserManager类

    ApplicationSignInManager类

    ApplicationUserStore类

    然后往Controller文件夹里面添加HomeController控制器,AccountController控制器

    先往HomeController控制器里添加index视图

    index视图代码

    @using Microsoft.AspNet.Identity
    @{
        ViewBag.Title = "Index";
    }
    
    <h2>Index</h2>
    @if (Request.IsAuthenticated)
    {
        using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
        {
            @Html.AntiForgeryToken()
            <p>Hello @User.Identity.GetUserName()</p>
            <ul>
                <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
            </ul>
        }
    }
    else
    {
        <ul>
            <li>
                @Html.ActionLink("Login", "Login", "Account")
            </li>
            <li>
                @Html.ActionLink("Register", "Register", "Account")
            </li>
        </ul>
    }

    然后AccountController控制器代码

    private ApplicationSignInManager signInManager;
            private ApplicationUserManager userManager;
    
            public ApplicationSignInManager SignInManager
            {
                get
                {
                    return signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
                }
                private set
                {
                    signInManager = value;
                }
            }
            public ApplicationUserManager UserManager
            {
                get { return userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
                private set
                {
                    userManager = value;
                }
            }
    
            [AllowAnonymous]
            public ActionResult Login(string returnUrl)
            {
                ViewBag.ReturnUrl = returnUrl;
                return View();
            }
            [HttpPost]
            [AllowAnonymous]
            [ValidateAntiForgeryToken]
            public async Task<ActionResult> Login(SignInModel model, string returnUrl)
            {
                if (!ModelState.IsValid)
                {
                    return View(model);
                }
                var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
                switch (result)
                {
                    case SignInStatus.Success:
                        return RedirectToLocal(returnUrl);
                    case SignInStatus.Failure:
                    default:
                        ModelState.AddModelError("", "登陆无效");
                        return View(model);
                }
    
            }
    
            [AllowAnonymous]
            public ActionResult Register()
            {
                return View();
            }
    
            [HttpPost]
            [AllowAnonymous]
            [ValidateAntiForgeryToken]
            public async Task<ActionResult> Register(SignUpModel model)
            {
                if (ModelState.IsValid)
                {
                    var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
                    var result = await UserManager.CreateAsync(user, model.Password);
                    if (result.Succeeded)
                    {
                        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                        return RedirectToAction("Index", "Home");
                    }
                    AddErrors(result);
                }
                return View(model);
            }
            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult LogOff()
            {
                AuthenticationManager.SignOut();
                return RedirectToAction("Index", "Home");
            }
            private void AddErrors(IdentityResult result)
            {
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError("", error);
                }
            }
            private ActionResult RedirectToLocal(string returnUrl)
            {
                if (Url.IsLocalUrl(returnUrl))
                {
                    return Redirect(returnUrl);
                }
                return RedirectToAction("Index", "Home");
            }
            private IAuthenticationManager AuthenticationManager
            {
                get { return HttpContext.GetOwinContext().Authentication; }
            }

    然后分别添加生成Login和Register页面

    Login页面代码

    @model IdentityDemo.Models.SignInModel
    
    @{
        ViewBag.Title = "Login";
    }
    
    <h2>Login</h2>
    
    @using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post))
    {
        @Html.AntiForgeryToken()
        
        <div class="form-horizontal">
            <h4>SignInModel</h4>
            <hr />
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
            <div class="form-group">
                @Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.TextBoxFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
                </div>
            </div>
    
            <div class="form-group">
                @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.PasswordFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
                </div>
            </div>
    
            <div class="form-group">
                @Html.LabelFor(model => model.RememberMe, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    <div class="checkbox">
                        @Html.CheckBoxFor(model => model.RememberMe)
                        @Html.ValidationMessageFor(model => model.RememberMe, "", new { @class = "text-danger" })
                    </div>
                </div>
            </div>
    
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="SignIn" class="btn btn-default" />
                </div>
            </div>
        </div>
    }
    
    <div>
        @Html.ActionLink("注册", "Register")
    </div>

    Register页面代码

    @model IdentityDemo.Models.SignUpModel
    
    @{
        ViewBag.Title = "Register";
    }
    
    <h2>Register</h2>
    
    @using (Html.BeginForm("Register", "Account", FormMethod.Post))
    {
        @Html.AntiForgeryToken()
        
        <div class="form-horizontal">
            <h4>SignUpModel</h4>
            <hr />
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
            <div class="form-group">
                @Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.TextBoxFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
                    
                </div>
            </div>
    
            <div class="form-group">
                @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.PasswordFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })                
                </div>
            </div>
    
            <div class="form-group">
                @Html.LabelFor(model => model.ConfirmPassword, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.PasswordFor(model => model.ConfirmPassword, new { htmlAttributes = new { @class = "form-control" } })
                    
                </div>
            </div>
    
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="SignUp" class="btn btn-default" />
                </div>
            </div>
        </div>
    }

    然后往项目的根目录添加Startup类

    然后修改根目录的Web.Config文件

    最后我们来测试一下看看效果怎么样,如下图

  • 相关阅读:
    补习系列(19)-springboot JPA + PostGreSQL
    【跟唐老师学习云网络】-第8篇 iptables
    【跟唐老师学习云网络】
    物联网与人工智能之间的区别与联系
    NB-IoT将成为未来5G物联网主流技术
    Python自带又好用的代码调试工具Pdb学习笔记
    Vue源码中compiler部分逻辑梳理(内有彩蛋)
    全新一代云服务器S6,重新定义性价比
    [HAOI2012]音量调节
    [SCOI2005]扫雷
  • 原文地址:https://www.cnblogs.com/R00R/p/7487655.html
Copyright © 2020-2023  润新知