【问题标题】:Web API C# - Role based accessWeb API C# - 基于角色的访问
【发布时间】:2020-09-24 15:56:54
【问题描述】:

我有一个网络应用程序,它具有三个不同的用户角色 Admin、Reseller 和 Seller。每个卖家都连接到一个经销商。

假设我们想要在经销商向 API 发出请求时显示卖家列表: GET: api/v1/members/sellers

预期结果将是与该经销商相关联的所有卖家。控制器可能看起来像这样:

[HttpGet]
[MemberAuthorize(AllowGroup = "Admin,Reseller")]
[Route("sellers")]
public HttpResponseMessage GetSellers()
{
    var member = _memberHelper.GetCurrentMember();
    if (member.Role == "Reseller")
        return sellersByReseller;
    if (member.Role == "Admin")
        return getAllSellers;

    ...
}

这可行,但在我看来它看起来并不漂亮,而且很难测试。

是否有另一种 C# Web API 方法可以用于此目的?与此类似的东西会非常整洁:

[HttpGet]
[MemberAuthorize(AllowGroup = "Reseller")]
[Route("sellers")]
public HttpResponseMessage GetSellers()
{
    getSellersByReseller;
}

[HttpGet]
[MemberAuthorize(AllowGroup = "Admin")]
[RoutePrefix("sellers")]
public HttpResponseMessage GetSellersAsAdmin()
{
    getAllSellers;
}

【问题讨论】:

    标签: c# asp.net-mvc asp.net-web-api roles


    【解决方案1】:

    我认为您不能像那样拆分它,主要是因为基于角色的身份验证不是相互排斥的。 IE。应该没有什么可以阻止用户同时拥有“管理员”角色和“经销商”角色。在这种情况下,路由将如何表现? IE。然后应该调用哪个控制器动作?


    无论如何,我建议你将它分成两条独立的路线,就像你已经建议的那样:

    [HttpGet]
    [MemberAuthorize(AllowGroup = "Reseller")]
    [Route("reseller/sellers")]
    public HttpResponseMessage GetSellersByReseller()
    {
        return getSellersByReseller;
    }
    
    [HttpGet]
    [MemberAuthorize(AllowGroup = "Admin")]
    [RoutePrefix("admin/sellers")]
    public HttpResponseMessage GetAllSellers()
    {
        return getAllSellers;
    }
    

    路线的命名是否有意义由您选择。最重要的是,我建议避免让一条路线返回不同的结果。是的,他们都返回了卖家列表,但前提不同,而不仅仅是由例如定义。一条路线可接受的搜索词。现在,这两条路线显然是针对两种不同的事物/受众的。

    【讨论】:

      猜你喜欢
      • 2018-09-04
      • 1970-01-01
      • 2020-02-06
      • 2015-04-07
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 2017-10-19
      相关资源
      最近更新 更多