
。会员管理系统使用安全上下文进行形式登录即权限验证,供大家参考,具体内容如下
1.在手动音量调节项目中添加用户类,可以根据实际项目需求添加必要属性
公共类user data {///summary///ID///summary public int UserId { get;设置;} ///摘要///用户名////摘要公共字符串用户名{ get设置;} ///摘要///角色身份列表////汇总公共Listint角色{获取设置;} }2.添加类校长实现安全上下文接口
公共类主体: IPrincipal { public iiidentity Identity { get;私有集;}公共用户数据帐户{获取设置;} ///摘要///构造函数////summary////param name=' ticket '/param///param name=' account '/param public Principal(FormsAuthenticationTicket,user data account){ if(ticket==null)抛出新的ArgumentNullException('票证');if (account==null)抛出新的ArgumentNullException(' UserData ');这个。身份=新表单身份(票证);这个。账户=账户;}公共bool IsInRole(字符串角色){ if(字符串IsNullOrEmpty(角色))返回真实的如果(这个账户==空||这个.账户。角色==null)返回错误的返回角色。拆分(',')。任何(q=帐户。角色。包含(int .解析(q)));} }IPrincipal接口有对象身份已经需要实现验证角色方法IsInRole()。在我们的实现类中添加了'用户信息(用户数据)'属性账户。
构造函数中进行了初始化,第一个对象为形式验证的票据对象,下面票会携带用户信息一起保存进甜饼干中。
3.创建存储甜饼干和读取甜饼干的类
///摘要///写入甜饼干和读取cookie/摘要公共类HttpFormsAuthentication { //将用户信息通过票加密保存到甜饼干公共静态void SetAuthenticationCoolie(用户数据帐户,int rememberDay=0){ if(account==null)引发新的argumentNullException(' account ');//序列化账户对象字符串accountJson=JsonConvert .SerializeObject(帐户);//创建用户票据var ticket=new FormsAuthenticationTicket(1,帐户。用户名,日期时间。现在,日期时间。现在。AddDays(rememberDay),false,accountJson);//加密字符串加密帐户=表单验证.加密(票证);//创建cookie var cookie=new Httpcookie(FormsAuthentication .FormsCookieName,encryptAccount) { HttpOnly=true,Secure=FormsAuthentication .要求SSL,域=表单验证烹饪领域,路径=表单验证.formscookePath };如果(记住第0天)饼干.过期时间=日期时间.现在。添加日期(记住日期);//写入Cookie HttpContext .当前。响应饼干.删除(饼干.名称);HttpContext .当前。响应饼干.添加(饼干);} //获取甜饼干并解析出用户信息公共静态principal tryarseprincipal(HttpContext上下文){ if (context==null)引发新的ArgumentNullException('上下文');请求=上下文.请求;HttpCookie cookie=请求饼干.用于身份验证formscookeNAmE];if (cookie==null || string .IsNullOrEmpty(cookie .值){ }返回null} //解密苦力值FormsAuthenticationTicket=FormsAuthentication .解密(饼干.价值);用户数据帐户=JsonConvert .反序列化对象用户数据(票证. UserData);返还新本金(票据、账户);} }存储甜饼干时将用户信息序列化后的字符串会计由票其携带加密后保存入甜饼干中,具体的会计被赋值给票据的用户数据属性。
可看到解析时将票。用户数据反序列化后得到了原始的用户信息对象,然后生成校长对象。
解析甜饼干得到校长对象的方法胰蛋白酶原,下面会在发起请求时用到,而返回的校长对象被赋值给HttpContext .用户。
4.在Global.asax中注册application _ post authenticaterequest事件,保证权限验证前将甜饼干中的用户信息取出赋值给用户
受保护的void Application _ post authenticaterequest(对象发送者,系统EventArgs e) { HttpContext .当前用户tryarseprincipal(HttpContext .当前);}5.集成如认证特性类并重写AuthorizeCore,HandleUnauthorizedRequest方法
公共类formauthorizateattribute : AuthorizeAttribute {///summary///先进入此方法,此方法中会调用AuthorizeCore验证逻辑,验证不通过会调用HandleUnauthorizedRequest方法////summary////param name=' filter context '/param public override void on AuthorizationContext filter context){ base .关于授权(过滤上下文);} ///摘要///权限验证////summary////param name=' httpContext '/param///returns/returns protected override bool author zecore(Httpcontextbase Httpcontext){ var user=Httpcontext .作为主体的用户;如果(用户!=null)返回用户是.角色(基础。角色);返回false}受保护的覆盖void未经授权的请求(AuthorizationContext筛选器上下文){//验证不通过,直接跳转到相应页面,注意:如果不是哟娜那个以下跳转,则会继续执行行动方法filterContext .结果=新的重定向结果(' ~/登录/索引');} }AuthorizeCore与HandleUnauthorizedRequest方法均是在方法授权中调用,AuthorizeCore验证不通过才会调用HandleUnauthorizedRequest方法。
将验证代码在AuthorizeCore中实现,验证不通过的逻辑在HandleUnauthorizedRequest方法中实现。
6.添加逻辑控制器实现登录逻辑
命名空间MVCAuthorizeTest .控制器{公共类LoginController :控制器{ [AllowAnonymous] //GET:登录公共操作结果索引(字符串返回网址){ viewpag .ReturnUrl=returnUrl返回视图();}[httpset][AllowAnonymous]公共行动结果索引(字符串名称、字符串密码记住我,字符串返回URL){ var account=new UserData(){ UserName=name,UserId=110,Roles=new Listint() { 1,2,3 } };HttpFormsAuthentication .SetAuthenticationCoolie(帐户,记住我?7 : 0);if (Url .islocalul(返回URl)返回URl .长度一返回一个Url .StartsWith('/')!返回Url .StartsWith('//')!返回Url .以('/ ')开头{ return Redirect(返回URL);} else { return redirectto操作(' Index ',' Home ');} }//POST :/Account/LogOn[HttpSet]公共操作结果LogOn(){ System .网络。保安。表单验证。注销();返回RedirectToAction('Index ',' Home ');} }}7.对需要验证的控制器或行为添加特性标签
[格式授权(角色='1,2')]公共类HomeController : Controller {[FormAuthorize]公共操作结果索引(){ return View();} }如图
8.在添加对象中添加全局注册过滤器,减少每个行为分别设置。如果有不需要验证的页面,添加[允许匿名]特性即可
公共类过滤器配置{公共静态void RegisterGlobalFilters(GlobalFilterCollection filters){ filters .add(new handleerrortattribute());//全局注册过滤过滤器。添加(新的formauthorizattribute());} }以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。