我需要在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
方法中,如下所示:
细节:
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:字节码和二进制有什么区别? - javajava字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…
java:继承 - java有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…
Java:BigInteger,如何通过OutputStream编写它 - java我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…