查找用户如何跨域工作 c#
Find user how to method work cross domain c#
UserPrincipal.FindByIdentity(…) 方法不能跨域。 SingleSignOn 应用程序池 运行 域外的用户未自动登录。当尝试以这些用户之一的身份访问 SingleSignOn 页面时,出现 NullReferenceException 错误
如果您想要一种方法来检查各个域中的用户,则必须遍历各个域(具有访问权限的用户可以读取每个域)。
如果您有可用的用户域信息,您可以将域作为参数添加到您的方法中。
我不确定 AuthUserSession
是否有任何 属性 可能也包含用户的域。如果是,请使用它而不是传递给该方法的域名参数。
public void LoadUserAuthInfo(AuthUserSession userSession, IAuthTokens tokens, Dictionary<string, string> authInfo, string domainName= someDefaultIfNoneProvided)
{
if (userSession == null)
return;
string lookup = userSession.Id;
List<string> domains = new List<string>() { "domain1", "domain2" };
bool userFound = false;
foreach (string domain in domains)
{
using (var pc = new PrincipalContext(ContextType.Domain, domain))
{
var user = UserPrincipal.FindByIdentity(pc, userSession.UserAuthName);
// ---> Add Check here to prevent NRE
if (user != null) {
SingleSignOnResponse ssoB = new SingleSignOnResponse();
ssoB.Username = user.Sid.Translate(typeof(NTAccount)).ToString();
ssoB.Timestamp = DateTime.Now;
SSOCache.Instance.TryAdd(lookup, ssoB);
userFound = true;
break; // No longer need to continue checking other domains.
}
else
{
// Handle case when user does not exist.
}
}
}
// Check if userFound = false. If so, do something with that exception.
}
更新
如果您在 session.id 中有域名,请使用以下内容,
string lookup = userSession.Id;
using (var pc = new PrincipalContext(ContextType.Domain, lookup.Split('\')[0]))
{
...
UserPrincipal.FindByIdentity(…) 方法不能跨域。 SingleSignOn 应用程序池 运行 域外的用户未自动登录。当尝试以这些用户之一的身份访问 SingleSignOn 页面时,出现 NullReferenceException 错误
如果您想要一种方法来检查各个域中的用户,则必须遍历各个域(具有访问权限的用户可以读取每个域)。
如果您有可用的用户域信息,您可以将域作为参数添加到您的方法中。
我不确定 AuthUserSession
是否有任何 属性 可能也包含用户的域。如果是,请使用它而不是传递给该方法的域名参数。
public void LoadUserAuthInfo(AuthUserSession userSession, IAuthTokens tokens, Dictionary<string, string> authInfo, string domainName= someDefaultIfNoneProvided)
{
if (userSession == null)
return;
string lookup = userSession.Id;
List<string> domains = new List<string>() { "domain1", "domain2" };
bool userFound = false;
foreach (string domain in domains)
{
using (var pc = new PrincipalContext(ContextType.Domain, domain))
{
var user = UserPrincipal.FindByIdentity(pc, userSession.UserAuthName);
// ---> Add Check here to prevent NRE
if (user != null) {
SingleSignOnResponse ssoB = new SingleSignOnResponse();
ssoB.Username = user.Sid.Translate(typeof(NTAccount)).ToString();
ssoB.Timestamp = DateTime.Now;
SSOCache.Instance.TryAdd(lookup, ssoB);
userFound = true;
break; // No longer need to continue checking other domains.
}
else
{
// Handle case when user does not exist.
}
}
}
// Check if userFound = false. If so, do something with that exception.
}
更新
如果您在 session.id 中有域名,请使用以下内容,
string lookup = userSession.Id;
using (var pc = new PrincipalContext(ContextType.Domain, lookup.Split('\')[0]))
{
...