Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 为本地访问使用匿名身份验证保护旧版Web服务网站_Asp.net_Web Services_Iis_Isapi - Fatal编程技术网

Asp.net 为本地访问使用匿名身份验证保护旧版Web服务网站

Asp.net 为本地访问使用匿名身份验证保护旧版Web服务网站,asp.net,web-services,iis,isapi,Asp.net,Web Services,Iis,Isapi,我有一个遗留的WebForms应用程序,它使用(ASP.net)Web服务(使用匿名访问),这些服务位于同一IIS服务器上(同一个域,不同的应用程序,每个应用程序都有自己的专用应用程序池)。此应用程序托管在安全的VPN中,但现在有一个公开托管它的请求 在不进行大量重新编码(在应用程序级别)的情况下,保护web服务站点的权宜(但安全)方法是什么。我已尝试在IIS中配置Web服务站点,以便它仅启用运行Web应用程序应用程序池的服务帐户(标识),但来自应用程序的当前请求模式始终使用匿名访问。我需要限制

我有一个遗留的WebForms应用程序,它使用(ASP.net)Web服务(使用匿名访问),这些服务位于同一IIS服务器上(同一个域,不同的应用程序,每个应用程序都有自己的专用应用程序池)。此应用程序托管在安全的VPN中,但现在有一个公开托管它的请求

在不进行大量重新编码(在应用程序级别)的情况下,保护web服务站点的权宜(但安全)方法是什么。我已尝试在IIS中配置Web服务站点,以便它仅启用运行Web应用程序应用程序池的服务帐户(标识),但来自应用程序的当前请求模式始终使用匿名访问。我需要限制访问权限,以便仅允许此特定web应用程序的访问。我正在考虑一个ISAPI过滤器,但不建议将其用于iis7+

附录:我很想找到一个基于IIS的解决方案。目前,我正试图将访问限制为仅基于Web应用程序源的访问。问题是(如上所述)这些请求都是“匿名的”,如果我可以让这些请求使用“网络服务””或其他一些本地身份,那么我将被设置


我建议您使用IdentityServer和OpenIdConnect来实现这一点

IdentityServer是一个基于.NET/Katana的框架和可承载组件 这允许为现代网络实现单点登录和访问控制 使用OpenID Connect和 OAuth2。它支持广泛的客户端,如移动、web、SPA和 桌面应用程序,可扩展以允许在新的和 现有架构

OpenIDConnect 1.0是OAuth2.0之上的一个简单标识层 协议它允许客户端验证最终用户的身份 基于授权服务器执行的身份验证,如 以及获取有关最终用户的基本配置文件信息 可互操作和类似REST的方式

使用此选项,您可以要求identity server为您提供访问令牌和Id令牌

标识令牌表示身份验证过程的结果。 它至少包含一个用户标识符(称为 子条款(主题索赔)。它可以包含有关的其他信息 用户和有关用户如何在OP上进行身份验证的详细信息

访问令牌允许访问资源。客户端请求访问 标记并将其转发到API。访问令牌包含信息 关于客户端和用户(如果存在)。API使用这些信息 授权访问他们的数据

例如,您可以在Webforms应用程序和WebService之间实现客户端凭据流。(在此流程中,您不会对WebForms应用程序的用户不问任何问题)。因此,WebForms应用程序将要求identity server为其提供访问webservices资源的访问令牌。在WebService中,您必须基于您想要的任何内容(范围、声明等)实现授权。请阅读LeastPrivilege博客(Dominick Baier),他和他的好友Brock Allen是这些话题的大师。因为我不能在StackOverflow中发布超过1个链接,这是非常糟糕的,所以你必须用谷歌搜索它们或谷歌任何其他信息

如果需要用户身份验证,可以使用隐式、代码或混合流。但这取决于你真正想做什么

我想您可能需要编写一些代码,但不会太多。您可以找到一种在到达任何端点之前请求授权的方法


我希望我是清楚的。如果没有,请询问我更多的解释。

经过更多的研究,我决定使用
http模块
解决方案,因为它有以下好处:

•最小编码

•无需修改现有代码库

•易于部署

•遵循现有的ASP.Net安全模型(本地访问)

模块(VS:DLL项目)


方法来保护web服务站点的安全,而无需进行大量的重新编码。如果我理解正确,您只需要禁用匿名身份验证并启用IIS文件夹中的表单身份验证,那么每个调用都需要进行身份验证。无需更改代码我不了解您当前的配置。您是否有一个web服务器、一个web站点、两个web应用程序:http://myserver/appWebForm和http://myserver/appAsmx?今天我的服务器是在私有/vpn网络上?@Nick.McDermaid我相信你的建议会涉及到在每个web请求上传递凭据,如果不是几百个,也有几十个,因此,我宁愿基于请求源进行身份验证,这样我就不必修改每个请求的现有代码库。@Fabrizio Accatino今天的配置与以前相同,两个web应用(站点)位于同一个默认网站下(每个都有自己的web.config)从以前的部署到今天的唯一变化是,整个服务器都在VPN上,因此不必担心对Web服务应用程序(SOAP XML)的安全访问。现在,我们希望将整个体系结构移动到一个公共服务器,因此我们需要锁定(安全)对Web服务应用程序的调用。不确定这是否能满足您的需要,但您是否考虑过将Web服务应用程序移动到另一个网站,绑定到一个非公开的tcp端口?如果您愿意,在这个新网站上,您甚至可以限制来自127.0.0.1/local_ip_地址的连接。感谢Daniel深思熟虑并记录在案的回复。我对OAuth2.0有点熟悉,但从来没有实现过令牌获取过程,因此有点像l
using System;
using System.Web;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FilterModule
{
    class AuthorizeLocal : IHttpModule
    {
        public void Init(HttpApplication app)
        {
            app.BeginRequest += new EventHandler(OnBeginRequest);
        }


        private void OnBeginRequest(Object s, EventArgs e)
        {
            HttpApplication app = s as HttpApplication;
            HttpRequest req = app.Request;
            HttpContext context = app.Context;

            if (!req.IsLocal)    // Is the request from a Local Source?
            {
                context.Response.Close(); // close the response: ends request
            }

            /* Optional Test Code - to view locally create an html page TestModule.html in target site */
            string Identity = Thread.CurrentPrincipal.Identity.Name;
            string filePath = context.Request.FilePath;
            string fileExtension = VirtualPathUtility.GetExtension(filePath);
            string fileName = VirtualPathUtility.GetFileName(filePath);

            if (fileName.ToLower().Equals("testmodule.html"))
            {
                try
                {
                    app.Context.Response.Write("app: " + app.ToString());
                    context.Response.Write("<br/>server: " + app.Server.ToString());
                    context.Response.Write("<br/>Thread.CurrentPrincipal.Identity.Name: " + Thread.CurrentPrincipal.Identity.Name);
                    context.Response.Write("<br/>HttpRequest: " + req.Url.ToString());
                    context.Response.Write("<br/>req.UserHostName: " + req.UserHostName);
                    context.Response.Write("<br/>req.UserHostAddress: " + req.UserHostAddress);
                    context.Response.Write("<br/>filePath: " + filePath);
                    context.Response.Write("<br/>fileName: " + fileName);
                    context.Response.Write("<br/>fileExtension: " + fileExtension);
                    context.Response.Write("<br/>req.IsLocal: " + req.IsLocal.ToString());
                    context.Response.Write("<br/>req.LogonUserIdentity: " + req.LogonUserIdentity);
                    context.Response.Write("<br/>req.UserHostName : " + req.UserHostName);
                    context.Response.Write("<br/>req.AnonymousID " + req.AnonymousID);
                    context.Response.Write("<br/>req.IsAuthenticated : " + req.IsAuthenticated);
                }
                catch (Exception Ex)
                {
                    context.Response.Write("<br/> " + Ex.ToString());
                }
            }

            //if (_eventHandler != null)
            //    _eventHandler(this, null);
        }

        public void Dispose()
        {

        }

    }
}
<add name ="FilterModule" type="FilterModule.AuthorizeLocal" />