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

本文关键字:访问授权 请求 数据 中间件 cookie net 核心 asp | 更新日期: 2023-09-27 17:57:11

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

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

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

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

正如您所说,可以访问有关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>();
}

最后在控制器顶部使用它(或者如果需要,您可以全局添加过滤器)

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