SharePoint高可信赖提供程序托管应用程序 - 用户模拟 - 站点管理员

时间:2016-02-29 19:08:45

标签: asp.net iis sharepoint siteminder sharepoint-apps

我们正在使用SiteMinder对用户进行身份验证,但我们从站点管理员处获得的是标头中的用户身份: ASP.NET Authentication with Siteminder

但是,由于我们使用的是高信任提供程序托管的SharePoint应用程序,因此我们可以访问tokenHelper.cs但是模拟用户需要System.Security.Principal.WindowsIdentity

我的问题是:

在这种情况下如何获得WindowsIdentity?

OR

如何使用用户身份扩展tokenHelper来模拟用户(没有windowsIdentity)?

2 个答案:

答案 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,上面的代码将正常工作,并将帮助您获得当前用户。