ASP.NET MVC 5网站开发用户注册(4)
首先,默认的Web项目由用户更改,因此删除自动生成的用户相关代码。
第二,增加会员区。右键单击web项目以添加成员区域。
添加主控制器并选择MVC5控制器-空
我们向公共ActionResult Index()添加了一个视图,代码显示用户名非常简单
@{ ViewBag。Title='会员中心';}h2欢迎!@用户。身份。名称/h2让我们先运行它,出现了问题。
这是因为项目中有两个名为Home的控制器,命名空间必须添加到路由中。在区域中打开成员注册以添加命名空间。
在项目中打开RouteConfig并添加一个命名空间
再次刷新浏览器,可以正常显示。
然后添加用户控制器用户控制器。
第三,模型类的改变首先,模型项目的用户模型在这里被修改。最初,人们认为每个用户只能属于一个用户组。经过慎重考虑,还是不适合。例如,一个用户拥有多个角色,因此用户和用户组之间的关系变为一对多。
用户模型。删除模型中的组标识和外键组。榜样。最初,考虑到在权限管理中调用角色比调用组更合适,用户组被更改为角色。另外,角色的含义更广,可以指用户组、职位、部门.修改后的代码如下:使用系统。component model . data annotations;Namespaceninesky。models {///summary///role ///备注///创建时间:2014.02.02 ///修改时间:2014 . 02 . 16////备注///summary公共类角色{[key]public int roleid set;}///summary///Name////summary[必选(error message=' required ')][string length(20,minimumlength=2,errormessage=' {1}到{0}个单词')] [Display(Name=' name')]公共字符串集;}///summary////角色类型br////0普通(普通注册用户),1特权(像VIP这样的类型),3管理(管理权限的类型)///summary[必选(错误消息='必选')] [Display(Name='用户组类型')]public int type set;}///summary///Description////summary[必选(errormessage='必选')] [stringlength (50,errormessage='少于{0}个单词')][Display(Name=' Description ')]public string Description { get;设置;}///summary////获取角色类型名称/////summary//返回/返回公共字符串类型tostring(){ switch(type){ case 0:返回' normal ';案例1:返回‘特权’;案例2:返回‘管理’;Default:返回“未知”;}} }}UserRoleRelation类。在模型项目中添加角色关系类用户角色关系类,代码:
使用系统。组件模型。数据注释;Namespaceninesky。models {///summary////用户角色关系////备注///创建时间:2014年2月16日////备注////summary public class用户角色关系{[key]public int relation id { get;设置;}///summary///user id////summary[required()]public int userid { get;设置;} ///summary ///角色id////summary[required()]public int roe lid { get;设置;} } } NineskyDbContext类。下图中的蓝色方框是修改后的零件,红色方框是新添加的
三.验证码和Sha256加密1。验证码现在验证码是网站必备的功能,我把验证码功能分为三个部分:创建验证码字符,根据验证码生成图片,在User Controller动作中保存验证码,返回图片。
创建验证码字符CreateVerificationText()
在公共中添加安全类,并使用伪随机数生成器在类中生成验证码字符串。
///摘要///创建验证码字符////summary///param name=' length '字符长度/param /返回验证码字符/返回公共静态字符串CreateVerificationText(int length){ char[]_ verification=new char[length];char[]_ dictionary={‘A’、‘B’、‘C’、‘D’、‘E’、‘F’、‘G’、‘H’、‘I’、‘K’、‘L’、‘M’、‘N’、‘O’、‘P’、‘Q’、‘R’、‘S’、‘T’、‘U’、‘V’、‘W’、‘Y’、‘Z’、‘A’、‘B’、‘C’、‘D’、‘E’、‘F’、‘G’、‘H’、‘I’、‘J’、‘K’、‘L’、‘M’、‘N’、‘O’、‘P’、‘Q’、‘R’、Random _ Random=new Random();for(int I=0;一、长度;I){ _验证[I]=_字典[_随机.下一个(_字典。长度-1)];}返回新字符串(_验证);}根据验证码生成图片CreateVerificationImage()思路是使用图形设备接口(图形设备接口)创建画布,使用伪随机数生成器生成渐变画刷,然后创建渐变文字。
///摘要///创建验证码图片////summary///param name=' verificationText '验证码字符串/param ///param name='width '图片宽度/param ///param name='height '图片长度/param /返回图片/返回公共静态位图CreateVerificationImage(字符串验证文本,整数宽度,整数高度){钢笔=新钢笔(颜色.黑色);Font _font=新字体(' Arial ',14,FontStyle .粗体);Brush _ brush=nullBitmap _bitmap=新位图(宽度、高度);图形_g=图形来自IMage(位图);SizeF _ TotalSizef=_ g . MeasureString(verificationText,_ font);SizeF _ curCharSizeFPointF _ startPointF=new PointF((width-_ TotalSizef .宽度)/2,(高度-_totalSizeF .高度)/2);//随机数产生器Random _ Random=new Random();_g。透明(颜色。白色);for(int I=0;交付文本。长度;I){ _ brush=new linegradientbrush(新点(0,0),新点(1,1),颜色.FromArgb(_random .下一个(255),_random .下一个(255),_random .接下来(255)),颜色FromArgb(_random ).下一个(255),_random .下一个(255),_random .下一个(255)));_g。拉绳(验证文本[i].ToString(),_font,_brush,_ startPointF);_ curCharSizeF=_ g . MeasureString(verificationText[I]).ToString(),_ font);_startPointF .X=_curCharSizeF .宽度;} _ g . Dispose();return _ bitmap}用户控制器行为中保存验证码并返回图片首先添加用户控制器,在成员区域中添加控制器用户控制器。在控制器中写一个验证代码方法。过程是:在方法中我们先创建6位验证码字符串-使用CreateVerificationImage创建验证码图片-把图片写入输出流中-把验证码字符串写入临时数据中。
保存在临时数据中和会议中的区别:TempData只传递一次,也就是传递到下一个行为后,行动代码执行完毕就会销毁,会话会持续保存,所以验证码用临时数据比较合适。
///摘要///验证码////summary////返回/返回公共操作结果VerificationCode(){ string VerificationCode=Security .CreateVerificationText(6);位图=安全性CreateVerificationImage(verificationCode,160,30);_img .保存(响应。输出流,系统绘图。成像。imageformat。JPEG);临时数据['验证代码']=验证代码.toupper();返回null}我们看看生成图验证码效果:
2、Sha256加密在普通项目的安全类中添加静态方法Sha256(字符串明文)
///摘要///256位散列加密////summary ///param name='明文'明文/param /返回密文/返回公共静态字符串Sha256(字符串明文){ sha 256 managed _ sha 256=新sha 256 managed();字节[]_密文=_sha256 .编码默认。GetBytes(明文));返回转换.至base64字符串(_密文);}四、注册在尼尼微。网络。区域。成员。模型中添加注册视图模型
使用系统。组件模型。数据注释;命名空间尼尼微.网络。区域。会员。models { public class registereviewmodel {///summary///用户名////摘要[必选(错误消息='必填)][字符串长度(20,最小长度=4,错误消息='{2}到{1}个字符)][显示(名称='用户名)]公共字符串用户名{ get设置;} ///摘要///显示名////摘要[必选(错误消息='必填)][字符串长度(20,最小长度=2,错误消息='{2}到{1}个字符)][显示(名称='显示名)]公共字符串DisplayName { get设置;} ///摘要///密码////摘要[必选(错误消息='必填)][显示(名称='密码)][字符串长度(20,最小长度=6,错误消息='{2}到{1}个字符)] [DataType(数据类型.密码])公共字符串密码{ get设置;} ///摘要///确认密码////摘要[必选(错误消息='必填)][比较('密码,错误消息='两次输入的密码不一致)][显示(名称='确认密码)] [DataType(数据类型.密码])公共字符串确认密码{获取设置;} ///摘要///邮箱////摘要[必选(错误消息='必填)][显示(名称='邮箱)] [DataType(数据类型。电子邮件地址,错误消息='电子邮件格式不正确)]公共字符串电子邮件{ get设置;} ///摘要///验证码////摘要[必选(错误消息='必填)][字符串长度(6,最小长度=6,错误消息='验证码不正确)][显示(名称='验证码)]公共字符串VerificationCode { get设置;} }}在用户控制器中添加注册()操作,并返回直接返回强类型(注册表视图模型)视图
///摘要///注册////summary////returns/returns公共动作结果Register(){ return View();}视图
@模型尼尼微网络。区域。会员。模特。registereviewmodel @ { viewpag .Title='注册;布局=' ~/视图/共享/_布局。“cshtml”;} @使用(Html .begin inform()){ @ Html .反伪造token()div=' form-横置' H4用户注册/h4 hr/@Html .ValidationSummary(true)div class=' form-group ' @ Html .标签(型号=型号.UserName,new { @ class=' control-label col-MD-2 ' })div class=' col-MD-10 ' @ Html .编辑(模型=模型.UserName) @Html .ValidationMessageFor(model=model .UserName)/div/div class=' form-group ' @ Html .标签(型号=型号.DisplayName,new { @ class=' control-label col-MD-2 ' })div class=' col-MD-10 ' @ Html .编辑(模型=模型.DisplayName) @Html .ValidationMessageFor(model=model .显示名称)/div/div class=' form-group ' @ Html .标签(型号=型号.密码,new { @ class=' control-label col-MD-2 ' })div class=' col-MD-10 ' @ Html .编辑(模型=模型.密码)@Html .ValidationMessageFor(model=model .密码)/div/div class=' form-group ' @ Html .标签(型号=型号.ConfirmPassword,new { @ class=' control-label col-MD-2 ' })div class=' col-MD-10 ' @ Html .编辑(模型=模型.确认密码)@Html .ValidationMessageFor(model=model .确认密码)/div/div class=' form-group ' @ Html .标签(型号=型号.电子邮件,new { @ class=' control-label col-MD-2 ' })div class=' col-MD-10 ' @ Html .编辑(模型=模型.电子邮件)@Html .ValidationMessageFor(model=model .电子邮件)/div/div class=' form-group ' @ Html .标签(型号=型号.VerificationCode,new { @ class=' control-label col-MD-2 ' })div class=' col-MD-10 ' @ Html .编辑(模型=模型.VerificationCode)img id=' VerificationCode ' title='点击刷新src=' http: @ Url .操作(' VerificationCode ')'样式='光标指针: '/@ Html .ValidationMessageFor(model=model .VerificationCode)/div/div class=' checkbox '输入类型='复选框'选中='正在检查'必需/我同意a href=' # ' 《用户注册协议》/a/div div class=' form-group ' div class=' col-MD-offset-2 col-MD-10 '输入类型='submit '值='注册=' BTNBTN-默认'//div/div }脚本类型=' text/JavaScript ' $(' #验证码').单击(function(){ $(' # verificationcode ')).attr('src ',' @ Url .操作('验证代码')?'新日期());})/script @ section Scripts { @ Scripts .渲染(' ~/bundle/jqueryval ')}再在用户控制器中添加公共动作结果寄存器(寄存器视图模型寄存器)用来处理用户提交的注册数据
[httpset][validateantforgerytoken]公共操作结果寄存器(registereviewmodel Register){ if(TempData[' VerificationCode ']==null | | TempData[' VerificationCode '].ToString()!=寄存器验证代码。Toupper()){模型状态.addmodelarror(' VerificationCode ','验证码不正确');返回视图(注册);} if(ModelState .IsValid) { if (userService .存在(注册。用户名))模型状态addmodelarror(' UserName ','用户名已存在');否则{用户=新用户(){用户名=注册.用户名,//默认用户组代码写这里显示名称=寄存器。显示名称,密码=安全性Sha256(寄存器。密码),//邮箱验证与邮箱唯一性问题电子邮件=注册。电子邮件,//用户状态问题状态=0,注册时间=系统。日期时间。现在};_用户=用户服务.添加(_用户);if (_user .用户标识0) {返回内容('注册成功!');//验证管理器.登录();} else { ModelState .AddModelError(','注册失败!');} } }返回视图(注册);}代码中很多根用户设置相关的内容先不考虑,等做到用户设置时在会后来修改。注册失败时返回视图并显示错误;成功时返回视图注册成功,等下次做用户登录时可以让用户注册完毕直接进行登录。看看效果。
点击注册,注册成功。
一个简单的用户注册完成了,主要有验证码、sha256加密、注册视图模型、验证用户提交数据并保存等步骤。后面就是用户注册,注册会用到声明实体和HttpContext .GetOwinContext()。认证。登录();
本文已整理成《ASP.NET MVC网站开发教程》,欢迎大家学习阅读。更多信息请参考ASP.NET MVC5网站开发专题。
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
版权声明:ASP.NET MVC 5网站开发用户注册(4)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

















