繁体   English   中英

基于路由参数的基于ASP.NET Web API角色的授权

[英]ASP.NET Web API role based authorization based on route parameter

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

现在我有以下场景:俱乐部经理只能为他管理的俱乐部做一个 GET。 俱乐部经理不应被授权进入他不管理的俱乐部。

这是获得俱乐部的方法:

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

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

您可以使用自定义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 ,但您在这里应该有足够的内容来根据您的需要对其进行自定义。

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

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

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

就我而言,我不希望从客户端向我的端点发送用户 ID。 我从已经授权的请求中获取用户 ID:

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

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

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

像这样:

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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM