• 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文件

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

  • 相关阅读:
    fn project 试用之后的几个问题的解答
    fn project 扩展
    fn project 生产环境使用
    fn project 对象模型
    fn project AWS Lambda 格式 functions
    fn project 打包Function
    fn project Function files 说明
    fn project hot functions 说明
    fn project k8s 集成
    fn project 私有镜像发布
  • 原文地址:https://www.cnblogs.com/R00R/p/7487655.html
Copyright © 2020-2023  润新知