Authentication 要求对本地IP.Net核心进行身份验证的中间件

Authentication 要求对本地IP.Net核心进行身份验证的中间件,authentication,asp.net-core,asp.net-web-api,.net-core,asp.net-core-webapi,Authentication,Asp.net Core,Asp.net Web Api,.net Core,Asp.net Core Webapi,在IIS中,我同时启用了antonymous和windows身份验证。在代码中,我想检查请求IP是否为不可路由IP,如果不是,我想让浏览器询问凭据 我尝试返回一个401状态码,但这并不强迫浏览器去挑战。我错过了什么?有更好的方法吗?如何创建一个类似于Authorize的自定义属性来实现WebAPI方法的相同行为(类似于LocalOnly) 以下是我在Startup.cs中的Configure方法: app.Use(async (context, next) => {

在IIS中,我同时启用了antonymous和windows身份验证。在代码中,我想检查请求IP是否为不可路由IP,如果不是,我想让浏览器询问凭据

我尝试返回一个401状态码,但这并不强迫浏览器去挑战。我错过了什么?有更好的方法吗?如何创建一个类似于Authorize的自定义属性来实现WebAPI方法的相同行为(类似于LocalOnly)

以下是我在Startup.cs中的Configure方法:

 app.Use(async (context, next) =>
        {
            var ip = context.Connection.RemoteIpAddress.ToString();
            var isInternal = Regex.IsMatch(ip, @"(^127\.)|(^(0)?10\.)|(^172\.(0)?1[6-9]\.)|(^172\.(0)?2[0-9]\.)|(^172\.(0)?3[0-1]\.)|(^169\.254\.)|(^192\.168\.)");
            if (!isInternal && !context.User.Identity.IsAuthenticated) {
                context.Response.StatusCode = 401;
            } else
            {
                await next();
            }
        });

请注意,资源(api)返回401,而客户端(如mvc)将用户路由到登录页面。因为你说的api和浏览器让我很困惑。对于mvc客户端,您可以替换
context.Response.StatusCode=401
等待上下文。ChallengeAsync()。但只有在启动时配置了默认的身份验证方案时,这才有效。谢谢@RuardvanElburg,你说得对。我指的是浏览器,因为它主要由运行在不同浏览器上的有角度的网站使用。事实证明,我发布的代码有效,我的应用程序是在IIS中的另一个应用程序下设置的,父应用程序关闭了windows身份验证。通过打开它,浏览器自动开始挑战。再次感谢。