ASP.NET?MVC5網(wǎng)站開發(fā)用戶登錄、注銷(五)
本文實(shí)例為大家分享了ASP.NET MVC5網(wǎng)站開發(fā)用戶登錄、注銷的具體方法,供大家參考,具體內(nèi)容如下
一、創(chuàng)建ClaimsIdentity
ClaimsIdentity(委托基于聲明的標(biāo)識)是在ASP.NET Identity身份認(rèn)證系統(tǒng)的登錄時要用到,我們在UserService中來生成它。
1、打開IBLL項(xiàng)目InterfaceUserService接口,添加接口方法ClaimsIdentity CreateIdentity(User user, string authenticationType);
2、打開BLL項(xiàng)目的UserService類,添加CreateIdentity方法的實(shí)現(xiàn)代碼
public ClaimsIdentity CreateIdentity(User user, string authenticationType)
{
ClaimsIdentity _identity = new ClaimsIdentity(DefaultAuthenticationTypes.ApplicationCookie);
_identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));
_identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.UserID.ToString()));
_identity.AddClaim(new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity"));
_identity.AddClaim(new Claim("DisplayName", user.DisplayName));
return _identity;
}二、獲取AuthenticationManager(認(rèn)證管理器)
打開Ninesky.Web項(xiàng)目 Member區(qū)域的UserController,添加AuthenticationManager屬性,在HttpContext.GetOwinContext()中獲取這個屬性。
#region 屬性
private IAuthenticationManager AuthenticationManager { get { return HttpContext.GetOwinContext().Authentication; } }
#endregion三、創(chuàng)建登錄視圖模型
Member區(qū)域的模型文件夾添加視圖模型
using System.ComponentModel.DataAnnotations;
namespace Ninesky.Web.Areas.Member.Models
{
/// <summary>
/// 登錄模型
/// <remarks>
/// 創(chuàng)建:2014.02.16
/// </remarks>
/// </summary>
public class LoginViewModel
{
/// <summary>
/// 用戶名
/// </summary>
[Required(ErrorMessage = "必填")]
[StringLength(20, MinimumLength = 4, ErrorMessage = "{2}到{1}個字符")]
[Display(Name = "用戶名")]
public string UserName { get; set; }
/// <summary>
/// 密碼
/// </summary>
[Required(ErrorMessage = "必填")]
[Display(Name = "密碼")]
[StringLength(20, MinimumLength = 6, ErrorMessage = "{2}到{1}個字符")]
[DataType(DataType.Password)]
public string Password { get; set; }
/// <summary>
/// 記住我
/// </summary>
[Display(Name = "記住我")]
public bool RememberMe { get; set; }
}
}
四、創(chuàng)建登錄頁面
在UserCcontroller中添加(string returnUrl) action
/// <summary>
/// 用戶登錄
/// </summary>
/// <param name="returnUrl">返回Url</param>
/// <returns></returns>
public ActionResult Login(string returnUrl)
{
return View();
}右鍵添加強(qiáng)類型視圖,模型為LoginViewModel
@model Ninesky.Web.Areas.Member.Models.LoginViewModel
@{
ViewBag.Title = "會員登錄";
}
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>會員登錄</h4>
<hr />
@Html.ValidationSummary(true)
<div class="form-group">
@Html.LabelFor(model => model.UserName, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.UserName)
@Html.ValidationMessageFor(model => model.UserName)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Password, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Password)
@Html.ValidationMessageFor(model => model.Password)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.RememberMe, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.RememberMe)
@Html.ValidationMessageFor(model => model.RememberMe)
</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>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
效果

五、創(chuàng)建用戶登錄處理action
在UserCcontroller中添加 httppost類型的 Login action中先用ModelState.IsValid看模型驗(yàn)證是否通過,沒通過直接返回,通過則檢查用戶密碼是否正確。用戶名密碼正確用CreateIdentity方法創(chuàng)建標(biāo)識,然后用SignOut方法清空Cookies,然后用SignIn登錄。
[ValidateAntiForgeryToken]
[HttpPost]
public ActionResult Login(LoginViewModel loginViewModel)
{
if(ModelState.IsValid)
{
var _user = userService.Find(loginViewModel.UserName);
if (_user == null) ModelState.AddModelError("UserName", "用戶名不存在");
else if (_user.Password == Common.Security.Sha256(loginViewModel.Password))
{
var _identity = userService.CreateIdentity(_user, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = loginViewModel.RememberMe }, _identity);
return RedirectToAction("Index", "Home");
}
else ModelState.AddModelError("Password", "密碼錯誤");
}
return View();
}
六、修改用戶注冊代碼
讓用戶注冊成功后直接登錄

七、注銷
在UserCcontroller中添加在Logout action
/// <summary>
/// 登出
/// </summary>
/// <returns></returns>
public ActionResult Logout()
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
return Redirect(Url.Content("~/"));
}
本文已被整理到了《ASP.NET MVC網(wǎng)站開發(fā)教程》,歡迎大家學(xué)習(xí)閱讀,更多內(nèi)容還可以參考ASP.NET MVC5網(wǎng)站開發(fā)專題學(xué)習(xí)。
本文主要是用到了ClaimsIdentity(基于聲明的標(biāo)識)、AuthenticationManager的SignOut、SignIn方法。希望對大家實(shí)現(xiàn)用戶注冊和注銷有所幫助。
相關(guān)文章
asp.net core 認(rèn)證和授權(quán)實(shí)例詳解
這篇文章主要為大家介紹了asp.net core 認(rèn)證和授權(quán)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
動態(tài)組合SQL語句方式實(shí)現(xiàn)批量更新的實(shí)例
動態(tài)組合SQL語句方式實(shí)現(xiàn)批量更新的實(shí)例,需要的朋友可以參考一下2013-03-03
如何傳值在2個頁面之間 要求不刷新父頁面,并且不能用Querystring傳值
通過Cookie,因?yàn)樗瓤梢栽诜?wù)器端對其進(jìn)行操作,也可在客戶端對其進(jìn)行操作但是缺點(diǎn)是不安全,而且有時客戶端會由于安全問題禁用Cookie!2008-12-12
使用ASP.NET?Web?API構(gòu)建Restful?API
這篇文章介紹了使用ASP.NET?Web?API構(gòu)建Restful?API的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04

