Windows为什么不让由mod_authnz_external调用的程序使用网络? - java

我需要在Windows下使用带有mod_authnz_external的Apache(XAMPP),该模块可以让您通过自己的外部程序处理身份验证。 (我的用例非常复杂。)该程序收到带有用户名的行和带有密码的行,并在其退出代码中返回结果:0表示成功,其他表示失败。

定制编译的mod_authnz_external在启动外部身份验证处理程序方面没有问题,该解决方案对于简单的处理程序也很好用。

但是,我需要我的身份验证处理程序来针对外部服务进行身份验证。当我手动运行处理程序时(即通过cmd.exe),这很好用,但是当处理程序由mod_authnz_external模块调用时,它会遇到各种奇怪的错误。

我对C#中的处理程序的第一枪看起来像这样:

class Program {
    static string LOGIN_ENDPOINT = "https://REDACTED";

    static bool CredentialsAreGood(string username, string password) {
        HttpWebRequest request = (HttpWebRequest) WebRequest.Create(new Uri(LOGIN_ENDPOINT));
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";

        NameValueCollection formData = HttpUtility.ParseQueryString(string.Empty);
        formData.Add("username", username);
        formData.Add("password", password);
        var bytes = Encoding.ASCII.GetBytes(formData.ToString());
        request.GetRequestStream().Write(bytes, 0, bytes.Length);

        try {
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK /* 200 */) {
                return true;
            }
            return false;
        } catch (WebException e) {
            return false;
        }
    }

    static void Main(string[] args) {
        string username = Console.ReadLine();
        string password = Console.ReadLine();

        if (CredentialsAreGood(username, password)) {
            Console.Error.WriteLine("Access ok for " + username);
            Environment.Exit(0);
        } else {
            Console.Error.WriteLine("Access BAD for " + username);
            Environment.Exit(1);
        }
    }
}

我通过mod_authnz_external调用此C#程序时遇到的错误出现在WebRequest.Create方法中,如下所示:
Windows为什么不让由mod_authnz_external调用的程序使用网络? - java

细节:
Windows为什么不让由mod_authnz_external调用的程序使用网络? - java
InnerException的堆栈跟踪:

at System.Net.SafeCloseSocketAndEvent.CreateWSASocketWithEvent(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType, Boolean autoReset, Boolean signaled)
at System.Net.NetworkAddressChangePolled..ctor()
at System.Net.AutoWebProxyScriptEngine.AutoDetector.Initialize()
at System.Net.AutoWebProxyScriptEngine.AutoDetector.get_CurrentAutoDetector()
at System.Net.AutoWebProxyScriptEngine..ctor(WebProxy proxy, Boolean useRegistry)
at System.Net.WebProxy.UnsafeUpdateFromRegistry()
at System.Net.WebProxy..ctor(Boolean enableAutoproxy)
at System.Net.Configuration.DefaultProxySectionInternal..ctor(DefaultProxySection section)
at System.Net.Configuration.DefaultProxySectionInternal.GetSection()

我还尝试在Java中使用类似的程序,并且在网络连接中也遇到了另一种错误(主机恰好存在):

Exception in thread "main" java.net.UnknownHostException: REDACTED.REDACTED.com
 at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
 at java.net.InetAddress$2.lookupAllHostAddr(Unknown Source)
 at java.net.InetAddress.getAddressesFromNameService(Unknown Source)
 at java.net.InetAddress.getAllByName0(Unknown Source)
 at java.net.InetAddress.getAllByName(Unknown Source)
 at java.net.InetAddress.getAllByName(Unknown Source)
 at org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45)
 at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:111)
 at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
 at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
 at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
 at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
 at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
 at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
 at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
 at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
 at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
 at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)
 at Authenticate.checkCredentials(Authenticate.java:33)
 at Authenticate.main(Authenticate.java:21)

当我以管理员身份运行Apache守护程序时,也会发生同样的情况。我正在尝试的方法在Linux下运行良好,但是目标环境是Windows。我目前的猜测是,如果它是由Apache启动的,可能会有一些安全功能阻止该处理程序访问网络,但是当我手动启动该处理程序时,它不会启动(这两个处理程序都在我自己运行时起作用)。

编辑:禁用Windows防火墙也无济于事。

是什么导致我的处理程序在访问网络时失败?我该如何解决?

非常感谢!

参考方案

造成问题的最可能原因是Windows内置防火墙不允许您的程序。添加允许规则,它应该起作用。

有效地将包含字母的字符串转换为Int-Apache Spark - java

我正在使用将用户作为字符串的数据集(即B000GKXY4S)。我想将这些用户中的每一个都转换为int,因此可以在Apache Spark ALS中使用Rating(user:Int,product:Int,rating:Double)类。最有效的方法是什么?最好使用Spark Scala函数或python本机函数。 参考方案 如果只想将任何可匹配的Strin…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…