首页 文章

asp.net 核心 w/cookie 中间件 - 访问授权请求数据

提问于
浏览
2

这个问题与这里基本相同,但是,对于 asp.net 核心,在使用 asp.net 核心 cookie 中间件时。

是否可以在验证时访问查询 string/request 正文数据,如果是,您会鼓励这个想法吗?似乎根据这个,它很可能是大男孩 asp.net 中的相同规则(例如你只是在给定的请求生命周期中读取一次请求数据)?

示例:我正在创建一个应用,其中人们拥有一个帐户,但是,他们是不同团队的成员。他们可以在应用程序中执行许多不同的操作,并且他们可以在一个团队或其他成员的“上下文”中执行该操作。所以,我在向服务器发出的请求中传递了一个 teamId 整数。我想从 ClaimsPrincipal 中提出索赔,确认他们确实是管道授权部分中该团队的成员。

1 回答

  • 6

    正如您所说,可以在OnValidatePrincipal事件上访问请求的数据。所以,你可以这样写:

    OnValidatePrincipal = async (context) =>
    {
          if (context.Request.Path.Value.StartsWith("/teams/")) 
          {
              var teamId = // get team id from Path;
    
              if (user is not team member)
              {
                  context.Response.StatusCode = 403;
              }
          }
    }
    

    **但是,**我认为您的要求与Authorization相关而不是Authentication。我会用Policy-Based Authorization来处理这个要求。示例策略应该是这样的:

    要求和处理程序:

    public class TeamMemberHandler: AuthorizationHandler<TeamMemberRequirement>
    {
        private readonly IActionContextAccessor _accessor; // for getting teamId from RouteData
        public TeamMemberHandler(IActionContextAccessor accessor)
        {
            _accessor = accessor;
        }
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TeamMemberRequirement requirement)
        {
            var teamId = // get teamId with using _accessor
            if (user is not member of team(by teamId))
            {
                context.Fail();
            }
            return Task.FromResult(0);
        }
    }
    public class TeamMemberRequirement : IAuthorizationRequirement
    {
    }
    

    配置服务:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
        services.AddAuthorization(options =>
        {
            options.AddPolicy("TeamMember",
                              policy => policy.Requirements.Add(new TeamMemberRequirement()));
        });
    
        services.AddSingleton<IAuthorizationHandler, TeamMemberHandler>();
    }
    

    最后在 controller(or 之上使用它,如果需要,可以全局添加过滤器)

    Authorize[(Policy = "TeamMember")]
    public class TeamHomeController : Controller
    {
        // Authorize[(Policy = "AnotherPolicy")]
        public IActionResult Index(){}
    }
    

相关问题