我们正在使用SiteMinder对用户进行身份验证,但我们从站点管理员处获得的是标头中的用户身份: ASP.NET Authentication with Siteminder
但是,由于我们使用的是高信任提供程序托管的SharePoint应用程序,因此我们可以访问tokenHelper.cs但是模拟用户需要System.Security.Principal.WindowsIdentity
我的问题是:
在这种情况下如何获得WindowsIdentity?
OR
如何使用用户身份扩展tokenHelper来模拟用户(没有windowsIdentity)?
答案 0 :(得分:1)
Steve Peschka检查blog。我已使用该博客在SiteMinder受保护的SharePoint 2013中设置了提供商托管应用程序。要模拟用户,您需要创建用户的ClaimsIdentity并将其作为当前用户插入到HttpContext中。以下示例代码:
var identity = new ClaimsIdentity(AuthenticationTypes.Federation, "http://schemas.xmlsoap.org/claims/useridentifier", String.Empty);
identity.AddClaim(new Claim("http://schemas.xmlsoap.org/claims/useridentifier", userId, "http://www.w3.org/2001/XMLSchema#string"));
identity.AddClaim(new Claim(ClaimTypes.Email, smtp, "http://www.w3.org/2001/XMLSchema#string"));
identity.AddClaim(new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sip", nameIdentifier, "http://www.w3.org/2001/XMLSchema#string"));
ClaimsPrincipal principal = new ClaimsPrincipal(identity);
将此ClaimsPrincipalas设置为Httpcontext用户。 要传递的声明值是smtp =用户的电子邮件,nameidentifier =用户的登录名,userId =用户的帐户名
答案 1 :(得分:0)
我将使用我的SP + Siteminder环境解释上述情况。
首先,您无法获得受网站管理员保护的网站的ClientContext。
您只能使用网站[http://hostname:port/sites/xyz]的内部网址获取网站的clientContext。
获取当前用户: -
var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext);
// We store internal url of webapplication in web.config
string strAdminSiteURL = ConfigurationManager.AppSettings["AdminSiteURL"].ToString();
// We have written one function to convert site-minder url to internal url
string webUrl = Helper.Helper.GetInternalSiteUrl(strAdminSiteURL, spContext.SPHostUrl.ToString());
// Use internal url to create client-context
using (ClientContext clientContext = new ClientContext(webUrl))
{
clientContext.AuthenticationMode = ClientAuthenticationMode.FormsAuthentication;
clientContext.FormsAuthenticationLoginInfo = new FormsAuthenticationLoginInfo(uName, pswd);
Web web = clientContext.Web;
clientContext.Load(web);
clientContext.ExecuteQuery();
// Load SP user from login name found from httpcontext
string currentSPUser = string.Concat("<<FBAIdentity>>", User.Identity.Name);
var currentUser = clientContext.Web.EnsureUser(currentSPUser);
clientContext.Load(currentUser);
clientContext.ExecuteQuery();
}
如果身份验证模式是FBA,上面的代码将正常工作,并将帮助您获得当前用户。