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 属性实现此目的吗?还是我在方法本身内进行此检查的唯一选择?
我有个主意。我认为您可以创建额外的自定义授权属性。
像这样:
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;
}
}
您可以使用自定义 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 恢复实际的合法用户。
这样,您就不必担心用户试图获取其他用户的信息。
我在 ASP.NET Web API 2 项目中使用角色来限制对某些资源的访问。
现在我有以下场景: 俱乐部经理只能为他管理的俱乐部执行 GET。俱乐部经理不应被授权访问他不管理的俱乐部。
这是获得俱乐部的方法:
[Authorize(Roles = "ClubManager")]
[Route("{clubId}")]
public Club GetClub(int clubId)
如您所见,我只允许具有 "ClubManager" 角色的用户访问此资源。但我还必须确保用户是路线参数中具有给定 clubId 的俱乐部的经理。 我可以使用 Authorize 属性实现此目的吗?还是我在方法本身内进行此检查的唯一选择?
我有个主意。我认为您可以创建额外的自定义授权属性。
像这样:
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;
}
}
您可以使用自定义 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 恢复实际的合法用户。 这样,您就不必担心用户试图获取其他用户的信息。