【问题标题】:ASP.NET Web API role based authorization based on route parameter基于路由参数的 ASP.NET Web API 角色授权
【发布时间】:2018-06-14 10:08:39
【问题描述】:

我在我的 ASP.NET Web API 2 项目中使用角色来限制对某些资源的访问。

现在我有以下情况: 俱乐部经理只能为他管理的俱乐部做 GET。俱乐部经理不应被授权访问非他管理的俱乐部。

这是获取俱乐部的方法:

[Authorize(Roles = "ClubManager")]
[Route("{clubId}")]
public Club GetClub(int clubId)

如您所见,我只允许具有“ClubManager”角色的用户访问此资源。但我还必须确保用户是俱乐部的经理,并且在路由参数中具有给定的 clubId。 我可以使用 Authorize 属性来实现这一点吗?还是我唯一的选择是在方法本身内进行此检查?

【问题讨论】:

    标签: c# asp.net-web-api2 authorize


    【解决方案1】:

    您可以使用自定义 AuthorizeAttribute 来执行此操作,例如:

    public class ClubAuthoriseAttribute : System.Web.Http.AuthorizeAttribute
    {
        protected override bool IsAuthorized(HttpActionContext actionContext)
        {
            int clubId;
            int.TryParse((string) actionContext.ActionArguments["clubId"], out clubId);
    
            if (!UserCanManageClub(clubId))
            {
                return false;
            }
    
            return base.IsAuthorized(actionContext);
        }
    }
    

    然后改用这个新属性:

    [ClubAuthorise(Roles = "ClubManager")]
    [Route("{clubId}")]
    public Club GetClub(int clubId)
    

    注意,这是假设参数名为 clubId,但您应该有足够的空间来根据需要对其进行自定义。

    【讨论】:

    • @NightOwl888 感谢您的编辑,但我是英国人,在这里我们拼写正确:)
    • 好吧,要么就是这样,要么改变GetClub方法上面的那个——它们不匹配。但是,嘿,整个 .NET 框架都是美式英语,所以要处理它(我对 Java 有同样的保留,偏爱英国)。
    • @DavidG 你如何保持经理和俱乐部之间的联系?即 UserCanManageClub 的实现。它是在数据库表中还是您能够使用您的开放 ID 提供程序对其进行管理?
    • @PatLong-MunkiiYebee 不知道你为什么问我,我只回答了被问到的问题。无论哪种方式,如果您有具体问题,都应该在新帖子中提出。
    • @DavidG 我意识到这是理论上的,因为这不是您要解决的问题我只是想知道您是否对如何解决有任何想法。 WRT“新帖子”你是说我应该在对这个 SO 问题的“回复”中问它吗?
    【解决方案2】:

    就我而言,ActionArguments 属性尚未填充到 IsAuthorized 方法中(请参阅ActionContext.ActionArguments Is Empty In IAuthenticationFilter 中的答案)。相反,我能够使用

    actionContext.RequestContext.RouteData.Values["clubId"]
    

    也许,这对将来的某人有帮助。

    【讨论】:

      【解决方案3】:

      在我的情况下,我不希望从客户端向我的端点发送用户 ID。我从已经授权的请求中获取用户 ID:

       [Authorize(Roles = "ClubManager")]
       public Club GetClub()
       {
          var userId = User.Identity.GetUserId();
          .
          .
          .
       }
      

      并使用该 id 来恢复实际的合法用户。 这样,您就不必担心用户试图获取其他用户的信息。

      【讨论】:

        【解决方案4】:

        我有个主意。我认为您可以另外创建自定义授权属性。

        像这样的:

        public class AuthorizeUserToClubAttribute : AuthorizeAttribute
        {   
            protected override bool AuthorizeCore(HttpContextBase httpContext)
            {
                bool result = false;
        
                //Get route data from context
                //Get current user from context
                //Ceck does user has an access and write result into variable
        
                return result;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-27
          • 2016-11-18
          • 1970-01-01
          • 2021-03-12
          • 2020-05-19
          • 1970-01-01
          • 2020-05-18
          • 2012-08-12
          相关资源
          最近更新 更多