首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果来自特定网址或同一站点asp.net核心3的请求,允许匿名访问

如果来自特定网址或同一站点asp.net核心3的请求,允许匿名访问
EN

Stack Overflow用户
提问于 2020-09-09 19:45:28
回答 1查看 750关注 0票数 0

我的web API托管在web应用程序中,由相同的站点前端使用ajax请求。如果来自同一个web应用程序前端API的请求承载在其中,但如果来自外部请求者的请求必须得到授权,我需要允许匿名访问这些API。我使用标识服务器4 Bearer来保护API和asp.net核心3。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-12 08:50:29

你必须做两件事:

  1. 添加默认身份验证(非白名单),
  2. 添加自定义授权策略,检查客户端IP

我想你已经得到第一名了。下面是你如何处理第二个问题:

添加授权策略,并使其成为默认的:

代码语言:javascript
复制
services.AddAuthorization(options =>
{
    options.AddPolicy("AllowedIpPolicy", config => 
    {
        config.AddRequirements(new AllowedIpRequirement());
    });
    options.DefaultPolicy = options.GetPolicy("AllowedIpPolicy");
});

添加授权需求AllowedIpRequirement,它只是一个空类:

代码语言:javascript
复制
public class AllowedIpRequirement : IAuthorizationRequirement { }

为此要求创建一个处理程序:

代码语言:javascript
复制
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服务:

代码语言:javascript
复制
services.AddSingleton<IAuthorizationHandler, AllowedIpRequirementHandler>();
services.AddHttpContextAccessor();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63818580

复制
相关文章

相似问题

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