加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.NET MVC 3自定义授权

发布时间:2020-12-16 04:18:51 所属栏目:asp.Net 来源:网络整理
导读:我正在编写一个ASP.NET MVC 3应用程序,我有很多角色: 系统管理员,客户管理员,预算所有者,应用所有者 我知道我可以使用[Authorize(Roles =“…”)]属性轻松限制对某些控制器(和操作方法)的访问. 但是,某些授权不仅仅基于角色,而是基于权限.例如,预算所有者应
我正在编写一个ASP.NET MVC 3应用程序,我有很多角色:

系统管理员,客户管理员,预算所有者,应用所有者

我知道我可以使用[Authorize(Roles =“…”)]属性轻松限制对某些控制器(和操作方法)的访问.

但是,某些授权不仅仅基于角色,而是基于权限.例如,预算所有者应该只能访问分配给其成本中心的预算 – 而不是其他人的预算.

目前我在action方法中有一些代码来检查:

if(UserCapabilities.CanAccessBudget(budgetId))
{
  // get budget and show view
}
else
{
  // redirect to index action
}

这开始使我的代码变得混乱并使检查安全性变成一场噩梦 – 因为我有许多需要这些不同类型的授权检查的动作方法.

我有一个想法是编写一些自定义属性,我可以用它来装饰我的动作方法并清理我的代码:

//
// GET: /Budgets/View/1
[CanAccessBudget]
public ActionResult View(int id)
{
 //...
}

人们怎么想?编写自定义属性是最干净,最易维护的方式吗?

解决方法

您可以编写自定义授权属性:
public class CanAccessBudgetAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthorized = base.AuthorizeCore(httpContext);
        if (isAuthorized)
        {
            var request = httpContext.Request;
            var budgetId = request.RequestContext.RouteData.Values["budgetId"] 
                ?? request["budgetId"];
            var currentUser = httpContext.User.Identity.Name;
            return HasPermissionsForBudget(currentUser,budgetId);
        }
        return isAuthorized;
    }
}

然后:

[CanAccessBudget]
public ActionResult View(int id)
{
    //...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读