asp.net-mvc – ASP.NET MVC App中基于声明的条件编辑操作授权设计

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – ASP.NET MVC App中基于声明的条件编辑操作授权设计前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用基于声明的模型设计ASP.Net MVC应用程序授权.让我们说我们有一个名为 – Product的对象.通常,有4种不同的操作 – 创建,编辑,删除和查看.授权使用ClaimsAuthorize属性完成.
  1. [Authorize]
  2. public class ProductController : Controller
  3. {
  4.  
  5. [ClaimsAuthorize("Product","VIEW")]
  6. public List<Product> GetProducts()
  7. {
  8. // ....
  9. }
  10.  
  11. [ClaimsAuthorize("Product","CREATE")]
  12. public Product CreateNewProduct(Product product)
  13. {
  14. //....
  15. }
  16. }

但就我而言,我必须支持不同类型的EDIT权限:

>如果同一用户最初创建了产品,则某些用户可以编辑产品
>如果产品属于特定类别,并且用户也可以访问同一类别,则某些用户可以编辑产品
>有些用户可以编辑所有产品(这是正常的产品编辑操作)

如何优雅地授权所有这些Edit操作(最好是如上所示的属性驱动),同时我希望将授权代码与普通的MVC控制器代码和业务逻辑分开.

[上面的代码示例在语法上不正确,我只是为了解释这个问题而编写的]
让我知道你的想法.

解决方法

对于你的问题的第一部分,基于声明的授权,我已经在 this similar question回答了它.我不打算在此重复.

但是对于您的另一个规则,例如只有所有者可编辑的产品.您可以为每个规则编写单独的AuthorizeAttribute并将其应用于您的操作,将此视为一个简单示例:

  1. using Microsoft.AspNet.Identity;
  2. public class OwnerAuthorizeAttribute : AuthorizeAttribute
  3. {
  4. private string _keyName;
  5. public bool IsPost { get; set; }
  6.  
  7. public OwnerAuthorizeAttribute(string keyName)
  8. {
  9. _keyName = keyName;
  10. }
  11.  
  12. protected override bool AuthorizeCore(HttpContextBase httpContext)
  13. {
  14. // imagine you have a service which could check owner of
  15. // product based on userID and ProductID
  16.  
  17. return httpContext.User.Identity.IsAuthenticated
  18. && this.ContainsKey
  19. && _productService.IsOwner(httpContext.User.Identity.GetUserId(),int.Parse(this.KeyValue.ToString()));
  20. }
  21.  
  22. private bool ContainsKey
  23. {
  24. get
  25. {
  26. return IsPost
  27. ? HttpContext.Current.Request.Form.AllKeys.Contains(_keyName)
  28. // for simplicity I just check route data
  29. // in real world you might need to check query string too
  30. : ((MvcHandler)HttpContext.Current.Handler).RequestContext
  31. .RouteData.Values.ContainsKey(_keyName);
  32. }
  33. }
  34. private object KeyValue
  35. {
  36. get
  37. {
  38. return IsPost
  39. ? HttpContext.Current.Request.Form[_keyName]
  40. // for simplicity I just check route data
  41. // in real world you might need to check query string too
  42. : ((MvcHandler)HttpContext.Current.Handler)
  43. .RequestContext.RouteData.Values[_keyName];
  44. }
  45. }
  46. }

您也可以对其他规则重复相同的模式.

您只需将自定义属性应用于您的操作:

  1. [OwnerAuthorize("id")]
  2. public ActionResult Edit(int id)
  3. {
  4. // your code
  5. }
  6.  
  7. [HttpPost]
  8. // double checking in post back too
  9. [OwnerAuthorize("id",IsPost = true)]
  10. public ActionResult Edit(Product product)
  11. {
  12. // your code
  13. }

很明显,您可以将多个AuthorizeAttribute应用于您的操作.在这种情况下,所有这些都必须返回true.

  1. [ClaimsAuthorize("Product","EDIT")]
  2. [OwnerAuthorize("id")]
  3. [YetOtherAuthorize]
  4. public ActionResult MyFancyAction(int id)
  5. {
  6. }

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