我在我的ASP.NET Web API2项目中使用角色来限制对某些资源的访问。
现在我有以下场景:俱乐部经理只能为他管理的俱乐部执行GET。俱乐部经理不应该被授权访问他不管理的俱乐部。
这是获得一个俱乐部的方法:
[Authorize(Roles = "ClubManager")]
[Route("{clubId}")]
public Club GetClub(int clubId)如您所见,我只允许角色为"ClubManager“的用户访问此资源。但我还必须确保用户是在clubId参数中具有给定路由的俱乐部的经理。我可以使用Authorize属性来实现这一点吗?或者,我唯一的选择是在方法本身中执行此检查吗?
发布于 2018-01-05 00:27:02
您可以使用自定义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,但您在这里应该有足够的空间来根据您的需要对其进行自定义。
发布于 2019-03-23 04:32:56
在我的例子中,IsAuthorized方法中还没有填充ActionArguments属性(参见ActionContext.ActionArguments Is Empty In IAuthenticationFilter中的answer )。取而代之的是,我能够使用
actionContext.RequestContext.RouteData.Values["clubId"]也许,这对将来的某个人有帮助。
发布于 2021-01-12 00:12:33
在我的例子中,我不希望用户ID从客户端发送到我的端点。我从已经授权的请求中获取用户ID:
[Authorize(Roles = "ClubManager")]
public Club GetClub()
{
var userId = User.Identity.GetUserId();
.
.
.
}并使用该id恢复实际的合法用户。这样,你就不必担心用户试图获取其他用户的信息。
https://stackoverflow.com/questions/48099316
复制相似问题