SharePoint提供程序应用程序高安全性Windows Auth

时间:2016-02-26 22:09:05

标签: authentication sharepoint sharepoint-2013

我已经设置了一个SharePoint开发环境并设法让一个提供商托管的应用程序与Certs等一起工作(高安全性)

这都是内部部署,我们将不会与ACS建立连接(现在,我可能已经错过了解ACS,我认为它基于Azure,服务器需要与服务器机房之外的服务器通信:))。

我的问题是:

SharePoint网站将不会使用Windows身份验证,我们将使用登录表单来读取其他商店的详细信息。

如果我查看VS生成的代码,我可以看到它需要Windows身份。

可以这样做吗?我原本期望我的提供商应用程序不需要任何auth作为其通过SharePoint托管,它从SharePoint获得声明,所以它为什么需要Windows身份以及SharePoint声明。

1 个答案:

答案 0 :(得分:0)

正如您所说:SharePoint网站将不会使用Windows身份验证,我们将使用登录表单来读取其他商店的详细信息。

Ans:您正在谈论基于表单的身份验证。

如果我查看VS生成的代码,我可以看到它需要Windows身份。

答:你是对的。 VS生成需要Windows标识的代码[适用于开发环境]。您需要编写单独的函数以使用SharePointContextProvider类获取FBA的clientcontext 上下文可以是:
CreateAppOnlyClientContextForSPHost(),CreateUserClientContextForSPHost()

我原本希望我的提供商应用程序不需要任何auth作为其托管的SharePoint

Ans:您可以将IIS网站[托管您的提供商托管应用程序]设置为允许匿名身份验证。

您可以使用此代码获取访问令牌。

var contextTokenString = TokenHelper.GetContextTokenFromRequest(Page.Request);
            var appWeb = new Uri(clientContext.Web.Url);

            if (contextTokenString != null)
            {
                SharePointContextToken contextToken =
                    TokenHelper.ReadAndValidateContextToken(contextTokenString, Request.Url.Authority);

                string accessToken =
                    TokenHelper.GetAccessToken(contextToken, appWeb.Authority).AccessToken;
}

获取当前用户: -

// Get current context to get load siteurl
                var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext);

                string webUrl =spContext.SPHostUrl.ToString();
                //using (var clientContext = spContext.CreateUserClientContextForSPHost())
                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("<<<FBADomainPrefix>>>",User.Identity.Name);
                    var currentUser = clientContext.Web.EnsureUser(currentSPUser);
                    clientContext.Load(currentUser);
                    clientContext.ExecuteQuery();
}