在SharePoint 2010中,使用AD用户认证的方式,可以很容易的根据登陆名(login name)得到SharePoint的用户。
例如AD用户所在的域为contoso,用户名为user1,可以使用下面的方式获取一个SharePoint user:
SPUser spUser = null;
try
{
spUser = delegateWeb.AllUsers["contoso\\user1"];
}
catch
{
}
但是在SharePoint 2013中,使用同样的方法就会报错 :“User can not be found”
因为SharePoint 2013中使用的是基于Claim的认证方式。
所以在SharePoint 2013中,正确的根据登录名获取SPUser的方法是:
string loginName = @"contoso\user1";
SPUser spUser = null;
SPClaimProviderManager cpm = SPClaimProviderManager.Local;
try //check spuser
{
SPClaim userClaim = cpm.ConvertIdentifierToClaim(loginName, SPIdentifierTypes.WindowsSamAccountName);
spUser = delegateWeb.AllUsers[userClaim.ToEncodedString()];
}
catch
{
}
if (spUser == null) //如果用户为空,试着取组
{
try
{
SPClaim userClaim = cpm.ConvertIdentifierToClaim(loginName, SPIdentifierTypes.WindowsSecurityGroupName);
spUser = delegateWeb.AllUsers[userClaim.ToEncodedString()];
}
catch
{
}
}
获取User sid的方法:
string sid = string.Empty;
if (spUser == null)
{
return sid;
}
if (!string.IsNullOrEmpty(spUser.Sid))
{
sid = spUser.Sid;
}
else
{
if (spUser.GetBinaryId() != null)
{
StringBuilder builder = new StringBuilder();
foreach (byte b in spUser.GetBinaryId())
{
builder.Append((Char)b);
}
sid = builder.ToString();
int index = sid.IndexOf(".w|");
if (index >= 0)
{
sid = sid.Substring(index + 3);
}
}
}
参考:http://blah.winsmarts.com/2013-6-The_right_way_to_find_a_SPUser_in_SharePoint_2013.aspx