• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ASP.NET MVC Preview 4 源代码学习笔记 FilterAttribute

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

不废话,从FilterAttribute开始:

 

 

 抽象类FilterAttribute的是整个基础,Membership验证AuthorizeAttribute和ActionFilterAttribute继承它。

AuthorizeAttribute实现IAuthorizationFilter接口:

void OnAuthorization(AuthorizationContext filterContext);

AuthorizeAttribute的实现:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    [AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level 
= AspNetHostingPermissionLevel.Minimal)]
    
public sealed class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter {

        
private string _roles;
        
private string _users;

        
public string Roles {
            
get {
                
return _roles ?? String.Empty;
            }
            
set {
                _roles 
= value;
            }
        }

        
public string Users {
            
get {
                
return _users ?? String.Empty;
            }
            
set {
                _users 
= value;
            }
        }

        
public void OnAuthorization(AuthorizationContext filterContext) {
            
if (filterContext == null) {
                
throw new ArgumentNullException("filterContext");
            }

            IPrincipal user 
= filterContext.HttpContext.User;
            
if (!user.Identity.IsAuthenticated) {
                filterContext.Cancel 
= true;
                filterContext.Result 
= new HttpUnauthorizedResult();
                
return;
            }

            
if (!String.IsNullOrEmpty(Users)) {
                IEnumerable
<string> validNames = SplitString(Users);
                
bool wasMatch = validNames.Any(name => String.Equals(name, user.Identity.Name, StringComparison.OrdinalIgnoreCase));
                
if (!wasMatch) {
                    filterContext.Cancel 
= true;
                    filterContext.Result 
= new HttpUnauthorizedResult();
                    
return;
                }
            }

            
if (!String.IsNullOrEmpty(Roles)) {
                IEnumerable
<string> validRoles = SplitString(Roles);
                
bool wasMatch = validRoles.Any(role => user.IsInRole(role));
                
if (!wasMatch) {
                    filterContext.Cancel 
= true;
                    filterContext.Result 
= new HttpUnauthorizedResult();
                }
            }
        }

        
private static IEnumerable<string> SplitString(string original) {
            
return from piece in original.Split(',')
                   let trimmed 
= piece.Trim()
                   
where !String.IsNullOrEmpty(trimmed)
                   select trimmed;
        }
    }

首先这个类是sealed的,要实现其他的用户验证,不能直接继承重写。

OnAuthorization方法依次验证用户是否登录,如果有users参数或者roles参数,也会一一验证用户是否匹配。


ActionFilterAttribute 以前在preview、preview 2、3里,也可以写用户验证,重写ActionFilterAttribute 实现的 IActionFilter 接口成员 OnActionExecuting 即可。但是在Preview 4中,要写自己的用户验证,应该实现IAuthorizationFilter接口成员。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap