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

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – ASP.NET MVC 3自定义授权前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个ASP.NET MVC 3应用程序,我有很多角色:

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

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

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

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

  1. if(UserCapabilities.CanAccessBudget(budgetId))
  2. {
  3. // get budget and show view
  4. }
  5. else
  6. {
  7. // redirect to index action
  8. }

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

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

  1. //
  2. // GET: /Budgets/View/1
  3. [CanAccessBudget]
  4. public ActionResult View(int id)
  5. {
  6. //...
  7. }

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

解决方法

您可以编写自定义授权属性
  1. public class CanAccessBudgetAttribute : AuthorizeAttribute
  2. {
  3. protected override bool AuthorizeCore(HttpContextBase httpContext)
  4. {
  5. var isAuthorized = base.AuthorizeCore(httpContext);
  6. if (isAuthorized)
  7. {
  8. var request = httpContext.Request;
  9. var budgetId = request.RequestContext.RouteData.Values["budgetId"]
  10. ?? request["budgetId"];
  11. var currentUser = httpContext.User.Identity.Name;
  12. return HasPermissionsForBudget(currentUser,budgetId);
  13. }
  14. return isAuthorized;
  15. }
  16. }

然后:

  1. [CanAccessBudget]
  2. public ActionResult View(int id)
  3. {
  4. //...
  5. }

猜你在找的asp.Net相关文章