gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:01:23 27 4
gpt4 key购买 nike

我需要在 Windows 下使用 Apache (XAMPP) 和 mod_authnz_external,该模块可让您通过自己的外部程序处理身份验证。 (我的用例非常复杂。)程序接收一行用户名和一行密码,并在退出代码中返回结果: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 方法中出现错误,如下所示:

详细信息: enter image description hereInnerException 的堆栈跟踪:

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 内置防火墙。添加允许规则,它应该可以工作。

关于java - 为什么 Windows 不让 mod_authnz_external 调用的程序使用网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34905029/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com