当前位置: 移动技术网 > IT编程>开发语言>.net > ASP.NET MVC5网站开发用户登录、注销(五)

ASP.NET MVC5网站开发用户登录、注销(五)

2017年12月12日  | 移动技术网IT编程  | 我要评论

赛车总动员3国语版,dark blue vol.1,陈一凡

一、创建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方法。希望对大家实现用户注册和注销有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网