首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于路由参数的ASP.NET Web API角色授权

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

Stack Overflow用户
提问于 2018-01-05 00:17:12
回答 4查看 6.2K关注 0票数 6

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

现在我有以下场景:俱乐部经理只能为他管理的俱乐部执行GET。俱乐部经理不应该被授权访问他不管理的俱乐部。

这是获得一个俱乐部的方法:

代码语言:javascript
复制
[Authorize(Roles = "ClubManager")]
[Route("{clubId}")]
public Club GetClub(int clubId)

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-01-05 00:27:02

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

代码语言:javascript
复制
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);
    }
}

然后使用这个新属性:

代码语言:javascript
复制
[ClubAuthorise(Roles = "ClubManager")]
[Route("{clubId}")]
public Club GetClub(int clubId)

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

票数 3
EN

Stack Overflow用户

发布于 2019-03-23 04:32:56

在我的例子中,IsAuthorized方法中还没有填充ActionArguments属性(参见ActionContext.ActionArguments Is Empty In IAuthenticationFilter中的answer )。取而代之的是,我能够使用

代码语言:javascript
复制
actionContext.RequestContext.RouteData.Values["clubId"]

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

票数 1
EN

Stack Overflow用户

发布于 2021-01-12 00:12:33

在我的例子中,我不希望用户ID从客户端发送到我的端点。我从已经授权的请求中获取用户ID:

代码语言:javascript
复制
 [Authorize(Roles = "ClubManager")]
 public Club GetClub()
 {
    var userId = User.Identity.GetUserId();
    .
    .
    .
 }

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48099316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档