ASP.NET MVC5网站开发用户登录、注销(五)
一、创建claimsidentity
claimsidentity(委托基于声明的标识)是在asp.net identity身份认证系统的登录时要用到,我们在userservice中来生成它。
1、打开ibll项目interfaceuserservice接口,添加接口方法claimsidentity createidentity(user user, string authenticationtype);
2、打开bll项目的userservice类,添加createidentity方法的实现代码
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(认证管理器)
打开ninesky.web项目 member区域的usercontroller,添加authenticationmanager属性,在httpcontext.getowincontext()中获取这个属性。
#region 属性 private iauthenticationmanager authenticationmanager { get { return httpcontext.getowincontext().authentication; } } #endregion
三、创建登录视图模型
member区域的模型文件夹添加视图模型
using system.componentmodel.dataannotations; namespace ninesky.web.areas.member.models { /// <summary> /// 登录模型 /// <remarks> /// 创建: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; } } }
四、创建登录页面
在userccontroller中添加(string returnurl) action
/// <summary> /// 用户登录 /// </summary> /// <param name="returnurl">返回url</param> /// <returns></returns> public actionresult login(string returnurl) { return view(); }
右键添加强类型视图,模型为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") }
效果
五、创建用户登录处理action
在userccontroller中添加 httppost类型的 login action中先用modelstate.isvalid看模型验证是否通过,没通过直接返回,通过则检查用户密码是否正确。用户名密码正确用createidentity方法创建标识,然后用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网站开发教程》,欢迎大家学习阅读,更多内容还可以参考asp.net mvc5网站开发专题学习。
本文主要是用到了claimsidentity(基于声明的标识)、authenticationmanager的signout、signin方法。希望对大家实现用户注册和注销有所帮助。
推荐阅读
-
ASP.NET MVC5网站开发用户修改资料和密码(六)
-
ASP.NET MVC5网站开发用户登录、注销(五)
-
ASP.NET MVC5网站开发之展示层架构(五)
-
ASP.NET MVC5网站开发之登录、验证和注销管理员篇1(六)
-
ASP.NET MVC5网站开发之用户角色的后台管理1(七)
-
ASP.NET MVC5网站开发之用户资料的修改和删除3(七)
-
ASP.NET MVC5网站开发之用户添加和浏览2(七)
-
ASP.NET MVC5网站开发之用户添加和浏览2(七)
-
ASP.NET MVC5网站开发之用户资料的修改和删除3(七)
-
ASP.NET MVC5网站开发之登录、验证和注销管理员篇1(六)