我试图在iOS的Xamarin Forms App中使用客户端证书进行身份验证,但似乎没有任何效果.如果我启动请求,应用程序等待默认超时100秒(我尝试使用HttpWebRequest.Timeout降低它,但设置似乎被忽略),之后,我得到以下异常:获取响应流时出错(ReadDone1) :ReceiveFailure
与Windows控制台应用程序相同的代码工作正常.这里有一些(为便于阅读而简化)片段重现:
客户:
var clientCertificate = new X509Certificate2(data, pwd);
var result = await ExecuteRequest("https://server/user.aspx", clientCertificate);
public static async Task<string> ExecuteRequest(Uri uri, X509Certificate2 clientCertificate)
{
var hwr = (HttpWebRequest)HttpWebRequest.Create(uri);
if (clientCertificate != null)
{
hwr.ClientCertificates.Add(clientCertificate);
}
hwr.Method = "GET";
try
{
var resWebResonse = await hwr.GetResponseAsync();
var stream = resWebResonse.GetResponseStream();
var sr = new StreamReader (stream);
return sr.ReadToEnd();
}
catch (Exception ex)
{
Debug.WriteLine($"Error executing Webrequest to {uri}: {ex}");
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
服务器:user.aspx
<%@ Page Language="C#" …Run Code Online (Sandbox Code Playgroud) 在Active Directory中给出这样的组:
MainGroup
GroupA
User1
User2
GroupB
User3
User4
Run Code Online (Sandbox Code Playgroud)
我可以轻松确定User3是否是MainGroup或其任何子组的成员,代码如下:
using System;
using System.DirectoryServices;
static class Program {
static void Main() {
DirectoryEntry user = new DirectoryEntry("LDAP://CN=User3,DC=X,DC=y");
string filter = "(memberOf:1.2.840.113556.1.4.1941:=CN=MainGroup,DC=X,DC=y)";
DirectorySearcher searcher = new DirectorySearcher(user, filter);
searcher.SearchScope = SearchScope.Subtree;
var r = searcher.FindOne();
bool isMember = (r != null);
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有类似的方法来获取作为组或其任何子组成员的所有用户,即在MainGroup的示例中获取User1,User2,User3和User4.
获取所有用户的显而易见的方法是递归查询每个子组,但我想知道是否有更简单的方法.
使用与memberOf:1.2.840.113556.1.4.1941:过滤器相同的方法,但使用域根而不是用户作为搜索库是不可行的,因为查询花费的时间太长(可能它会为域中的所有用户递归计算所有组成员资格并检查它们是否存在是特定组的成员).
获取组中所有成员(包括其子组)的最佳方法是什么?