2015-01-08 201 views
1

我有一个复杂的应用程序,其中包含许多Web Api调用,它们需要数据库中的权限检查。一个例子简单的API调用我可能是:ASP.Net MVC Web API的自定义授权

[HttpGet] 
    public IEnumerable<StudentContact> GetStudentContacts(int id) 
    { 
     return db.StudentContacts.AsNoTracking().Where(n => n.StudentId == id && n.Current_Record == true).OrderBy(n => n.RankOrder); 
    } 

而要做到权限检查我必须做到以下几点:

int staffID = (User as CustomPrincipal).UserId; 
int siteId = Functions.GetSiteIdFromCookie(); 
if (Functions.UserHasAccess(staffID, AccessLevels.access_StudentDetailsUpdate,siteId) == true) return true; 
else return false; 

我想达成什么是创建一个自定义授权注解所以我可以有:

[HttpGet] 
[PermissionAuth(AccessLevels.access_StudentDetailsUpdate,AccessLevels.access_StudentDetailsReadOnly)] 
public IEnumerable...... 

而我可能需要有一个选项和/或即两者都是真实的或一个是真实的。谁能帮忙?

+0

你看着使用过滤器? – Liath

+0

不容易设置自定义过滤器吗?它会拒绝访问该功能吗? – user1166905

回答

1

这可以通过扩展AuthorizeAttribute并覆盖IsAuthorized方法来实现。 下面的东西就是你需要的东西。

public class PermissionAuthAttribute : AuthorizeAttribute 
{ 
    private readonly List<string> _accessLevels; 


    public PermissionAuth(params string[] accessLevels) 
    { 
     _accessLevels = accessLevels.ToList(); 
    } 

    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
     if (!base.IsAuthorized(actionContext)) 
     { 
      return false; 
     } 
     int staffID = (User as CustomPrincipal).UserId; 
     int siteId = Functions.GetSiteIdFromCookie(); 
     if (Functions.UserHasAccess(staffID, AccessLevels.access_StudentDetailsUpdate,siteId) == true) { 
      return true; 
     } 
     else { 
      return false 
     }; 
    } 
} 

然后你的方法上面使用[PermissionAuth(/*permissions here*/)]

+0

我会对此有一个解释。对于OR的情况,你建议我做什么?即只要设置了两个权限中的一个即可。 – user1166905

+0

基本上你只需要修改逻辑如果'IsAuthorized'方法返回true它们被允许在 –

+0

在上面的代码中我如何获得在注释中输入的权限到IsAuthorized方法中? – user1166905