gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:17:09 25 4
gpt4 key购买 nike

使用基于声明的模型设计 ASP.Net MVC 应用程序授权。假设我们有一个名为“产品”的对象。通常,有 4 种不同的操作 - 创建、编辑、删除和查看。授权是使用 ClaimsAuthorize 属性完成的。

[Authorize]
public class ProductController : Controller
{

[ClaimsAuthorize("Product", "VIEW")]
public List<Product> GetProducts()
{
// ....
}

[ClaimsAuthorize("Product", "CREATE")]
public Product CreateNewProduct(Product product)
{
//....
}
}

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

  1. 如果产品最初由同一用户创建,则某些用户可以编辑该产品

  2. 如果产品属于特定类别并且用户也有权访问同一类别,则某些用户可以编辑该产品

  3. 某些用户可以编辑所有产品(这是正常的产品编辑操作)

如何优雅地授权所有这些编辑操作(最好是如上所示的属性驱动),同时我希望将授权代码与正常的 MVC Controller 代码和业务逻辑分开。

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

最佳答案

对于您问题的第一部分,基于声明的授权,我已经在 this similar question 中回答了它。 。我不会在这里重复。

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

using Microsoft.AspNet.Identity;
public class OwnerAuthorizeAttribute : AuthorizeAttribute
{
private string _keyName;
public bool IsPost { get; set; }

public OwnerAuthorizeAttribute(string keyName)
{
_keyName = keyName;
}

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
// imagine you have a service which could check owner of
// product based on userID and ProductID

return httpContext.User.Identity.IsAuthenticated
&& this.ContainsKey
&& _productService.IsOwner(httpContext.User.Identity.GetUserId(),
int.Parse(this.KeyValue.ToString()));
}

private bool ContainsKey
{
get
{
return IsPost
? HttpContext.Current.Request.Form.AllKeys.Contains(_keyName)
// for simplicity I just check route data
// in real world you might need to check query string too
: ((MvcHandler)HttpContext.Current.Handler).RequestContext
.RouteData.Values.ContainsKey(_keyName);
}
}
private object KeyValue
{
get
{
return IsPost
? HttpContext.Current.Request.Form[_keyName]
// for simplicity I just check route data
// in real world you might need to check query string too
: ((MvcHandler)HttpContext.Current.Handler)
.RequestContext.RouteData.Values[_keyName];
}
}
}

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

您可以简单地将自定义属性应用于您的操作:

[OwnerAuthorize("id")]
public ActionResult Edit(int id)
{
// your code
}

[HttpPost]
// double checking in post back too
[OwnerAuthorize("id", IsPost = true)]
public ActionResult Edit(Product product)
{
// your code
}

很明显,您可以将多个 AuthorizeAttribute 应用于您的操作。在这种情况下,它们全部都必须返回true

[ClaimsAuthorize("Product", "EDIT")]
[OwnerAuthorize("id")]
[YetOtherAuthorize]
public ActionResult MyFancyAction(int id)
{
}

关于asp.net-mvc - ASP.NET MVC 应用程序中条件编辑操作的基于声明的授权设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31846452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com