下面是"Asp.Mvc 2.0实现用户登录与注销功能实例讲解(2)"的完整攻略:
1. 准备工作
在开始实现用户登录和注销功能之前,我们需要先创建一个基本的MVC应用程序并配置好实体框架(Entity Framework)。接下来我们需要添加一个用户管理模块(例如ASP.NET Identity库)来实现用户的身份验证和授权。
具体操作步骤如下:
- 创建一个新的ASP.NET MVC项目,选择“Web应用程序”模板,命名为“LoginDemo”;
- 在“包管理器控制台”中使用以下命令安装ASP.NET Identity库:
Install-Package Microsoft.AspNet.Identity.Core
上述命令会在项目中安装ASP.NET Identity核心模块,包括用户管理、角色管理和授权等功能。
- 添加一个新的控制器,在控制器中添加以下代码:
```
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System.Threading.Tasks;
using System.Web.Mvc;
public class AccountController : Controller
{
private UserManager
private SignInManager
public AccountController()
{
var userStore = new UserStore<ApplicationUser>(new ApplicationDbContext());
userManager = new UserManager<ApplicationUser>(userStore);
signInManager = new SignInManager<ApplicationUser, string>(userManager, HttpContext.GetOwinContext().Authentication);
}
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var result = await signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
return View(model);
}
public ActionResult Logout()
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
return RedirectToAction("Index", "Home");
}
}
```
上述代码中,我们通过ASP.NET Identity库提供的UserManager和SignInManager类来管理用户和实现用户身份验证功能,并添加了两个Action方法,分别用于用户登录和注销。
- 接下来添加一个LoginViewModel实体类,包含用户登录时需要提交的表单信息(用户名、密码和“记住我”选项)。代码如下:
public class LoginViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
至此,我们已经完成了项目的基本框架和身份验证组件的集成工作,可以开始实现用户登录和注销页面的设计和代码编写了。
2. 实现用户登录
实现用户登录的过程可以通过一个页面展示用户登录的表单,并通过POST请求方式提交表单验证用户身份。如果提交的表单信息有效,应用程序将认证用户身份并导航至受保护的页面。
下面我们来实现一个用户登录页面和相关的Action代码。请按照下列步骤操作:
- 在视图文件夹中创建名为“Account”的子文件夹;
- 在“Account”子文件夹下创建名为“Login.cshtml”的视图文件并添加以下代码:
```
@model LoginViewModel
@{
ViewBag.Title = "Login";
}
@ViewBag.Title.
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<div class="form-group">
@Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Email, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.Password, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<div class="checkbox">
@Html.CheckBoxFor(m => m.RememberMe)
@Html.LabelFor(m => m.RememberMe)
</div>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<button type="submit" class="btn btn-default">Log in</button>
</div>
</div>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
```
上述代码中,我们使用ASP.NET MVC内置的HtmlHelper类和ViewModel类实现用户登录表单,并使用jQuery.Validation库对表单数据进行客户端验证。
- 继续在“Account”文件夹下创建另一个视图文件,命名为“_LoginPartial.cshtml”,该文件的作用是显示用户登录状态或登录表单。
```
@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
}
else
{
}
```
- 接下来为“Account”控制器添加一个LoginAction方法,用于验证用户登录,代码如下:
```
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task
{
if (ModelState.IsValid)
{
var result = await signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
return View(model);
}
```
注:上述代码中,视图中的“@Html.AntiForgeryToken()”和Action方法的“[ValidateAntiForgeryToken]”特性是用于防止跨站请求攻击(XSRF/CSRF)的。
至此,我们完成了用户登录功能的实现。
3. 实现用户注销
用户注销功能实现相对简单,只需要在服务器端处理完注销操作后,将用户重定向至登录页面即可。
下面我们来实现用户注销功能,代码如下:
public ActionResult Logout()
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
return RedirectToAction("Index", "Home");
}
以上代码中,我们使用AuthenticationManager类的SignOut方法从当前会话中删除认证Cookie,并将用户重定向至网站首页。
然后,我们还需要在视图文件中添加注销链接。在前面创建的"_LoginPartial.cshtml"文件中添加一个注销链接:
@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
<div class="navbar-form navbar-right" role="search">
<p>Hello, @User.Identity.Name!</p>
@using (Html.BeginForm("Logout", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
{
@Html.AntiForgeryToken()
<a href="javascript:document.getElementById('logoutForm').submit()">Log off</a>
}
</div>
}
在上面的代码中,我们使用了一个表单来提交注销的POST请求,通过调用HomeController的Index方法实现用户重定向至网站首页。
以上便是"Asp.Mvc 2.0实现用户登录与注销功能实例讲解(2)"的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Asp.Mvc 2.0实现用户登录与注销功能实例讲解(2) - Python技术站