如果来自特定 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.
你必须做两件事:
- 照常添加默认 (non-whitelisted) 身份验证
- 添加检查客户端 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();
我将 Web API 托管在 Web 应用程序中,并由 ajax 请求的同一站点前端使用。如果来自同一 Web 应用程序前端 API 的请求托管,我需要允许匿名访问这些 API,但如果来自外部请求者的请求必须经过授权。我使用身份服务器 4 Bearer 来保护 API 和 asp.net 核心 3.
你必须做两件事:
- 照常添加默认 (non-whitelisted) 身份验证
- 添加检查客户端 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();