如果来自特定 URL 或同一站点 asp.net 的请求允许匿名访问 core 3

allow anonymous access if request from the specific URL or the same site asp.net core 3

我将 Web API 托管在 Web 应用程序中,并由 ajax 请求的同一站点前端使用。如果来自同一 Web 应用程序前端 API 的请求托管,我需要允许匿名访问这些 API,但如果来自外部请求者的请求必须经过授权。我使用身份服务器 4 Bearer 来保护 API 和 asp.net 核心 3.

你必须做两件事:

  1. 照常添加默认 (non-whitelisted) 身份验证
  2. 添加检查客户端 IP 的自定义授权策略

我假设你得到了第一名。以下是您处理数字 2 的方式:

添加授权策略,并将其设为默认值:

services.AddAuthorization(options =>
{
    options.AddPolicy("AllowedIpPolicy", config => 
    {
        config.AddRequirements(new AllowedIpRequirement());
    });
    options.DefaultPolicy = options.GetPolicy("AllowedIpPolicy");
});

添加授权要求AllowedIpRequirement,这只是一个空class:

public class AllowedIpRequirement : IAuthorizationRequirement { }

为此要求创建处理程序:

public class AllowedIpRequirementHandler : AuthorizationHandler<AllowedIpRequirement>
{
    private readonly IHttpContextAccessor _contextAccessor;

    public AllowedIpRequirementHandler(IHttpContextAccessor contextAccessor)
    {
        _contextAccessor = contextAccessor;
    }

    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext context,
        AllowedIpRequirement requirement)
    {
        var httpContext = _contextAccessor.HttpContext;
        if (IsAllowedIp(httpContext.Connection.RemoteIpAddress) ||
            context.User.Identity.IsAuthenticated)
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }

    private bool IsAllowedIp(IPAddress connectionRemoteIpAddress)
    {
        // ...check if allowed ip...
    }
}

最后注册处理程序和所需的 IHttpContextAccessor 服务:

services.AddSingleton<IAuthorizationHandler, AllowedIpRequirementHandler>();
services.AddHttpContextAccessor();