【发布时间】:2014-07-12 18:50:33
【问题描述】:
在过去的一周里,我一直在苦苦挣扎,无法解决共享点提供商托管应用的正确身份验证问题。
我目前正在为一家公司的在线 Sharepoint 开发一个 sharepoint 应用程序。我正在使用 Visual Studio 2013。我将该应用程序作为云服务部署在公司的 Windows Azure 门户上。当我需要制作 HttpPost 时,一切都很顺利,然后应用程序无法进行身份验证。控制器的设计如下:
[SharePointContextFilter]
public ActionResult Index()
{
UserSingleton user_temp = UserSingleton.GetInstance();
User spUser = null;
SharePointContext spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext);
using (var clientContext = spContext.CreateUserClientContextForSPHost())
{
if (clientContext != null)
{
spUser = clientContext.Web.CurrentUser;
clientContext.Load(spUser, user => user.Title, user => user.Email);
clientContext.ExecuteQuery();
....code....
}
}
....code....
return View();
}
加载索引页面很顺利,该操作创建了用户上下文,一切都很好。当我尝试按如下方式提交 HttpPost 时,问题就出现了:
[HttpPost]
[ValidateAntiForgeryToken]
[SharePointContextFilter]
public ActionResult GetService(System.Web.Mvc.FormCollection fc)
{
PlannedHours ph = this.PopulateModel(fc);
if (ph == null)
return View("NoInfoFound");
ViewData["PlannedHours"] = ph;
return View("Index");
}
当我通过发布按钮调用它时,我收到“无法确定您的身份。请通过启动安装在您网站上的应用重试。” Shared/Error.cshtml 视图。问题是,当我删除 [SharePointContextFilter] 时它可以工作,但这意味着请求没有通过 [SharePointContextFilter] 因此它没有正确验证?或者是吗?因为它无法验证用户的合法性。
当我不删除 [SharePointContextFilter] 并调用帖子时,我注意到一件事,然后 url 最终没有 {StandardTokens} 查询。是不是应该是这样 - 我的意思是它就像 hostname.com/Home/GetService 一样,但是当我使用 actionlink 时,spcontext.js 总是将 {StandardTokens} 查询附加到基本 url - smth 就像 hostname.com/Home /ActionNAme/?SPHostUrl=https%3A%2F%2FSHAREPOINTPAGEURL....
我注意到的是,我在没有附加查询的情况下调用 hostname.com/Home/ActionNAme/ 它未能通过 [SharePointContextFilter]。
我对 sharepoint 2013 和 MVC 5 ( Razor ) 还很陌生,所以如果您知道为什么我的 HttpPost 未能通过 [SharePointContextFilter],请尝试解释我或提供任何建议。我尝试过使用 HttpGet 但是,当我调用具有 [SharePointContextFilter] 并附加 SPHostUrl= 令牌的 HttpGet 时,它可以工作。但是我不能使用 [ValidateAntiForgeryToken]。由于 [SharePointContextFilter] 总是检查用户的合法性,因此在这样的应用程序中是否甚至需要 [ValidateAntiForgeryToken]?我现在很困惑。网上有大量资料可供阅读,没有什么可以解释何时附加这些标准令牌,何时使用 [SharePointContextFilter] 等。事实上,我正在开发一个共享点应用程序,这是我的第一次。在过去的 3 周里,我一直在研究和编码。所以我的知识还很有限,在回答时请记住这一点。在此先感谢,我希望我能对正在发生的事情有所了解!
------------------更新----------------- ----------------------
好的,快速更新。我发现了一些相当奇怪的东西。 SharePointContextFilterAttribute.cs
public class SharePointContextFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
Uri redirectUrl;
switch (SharePointContextProvider.CheckRedirectionStatus(filterContext.HttpContext, out redirectUrl))
{
case RedirectionStatus.Ok:
return;
case RedirectionStatus.ShouldRedirect:
filterContext.Result = new RedirectResult(redirectUrl.AbsoluteUri);
break;
case RedirectionStatus.CanNotRedirect:
filterContext.Result = new ViewResult { ViewName = "Error" };
break;
}
}
}
总是返回最后一种情况( RedirectionStatus.CanNotRedirect ),因为 SharePointContextProvider.CheckRedirectionStatus(filterContext.HttpContext, out redirectUrl) 方法包含一些我无法理解的内容。
首先:
Uri spHostUrl = SharePointContext.GetSPHostUrl(httpContext.Request);
if (spHostUrl == null)
{
return RedirectionStatus.CanNotRedirect;
}
好的,我明白 - 如果 httpContext.Request 不包含 spHostUrl,它将无法重定向。出于某种原因,它必须存在。
但是如下:
if (StringComparer.OrdinalIgnoreCase.Equals(httpContext.Request.HttpMethod, "POST"))
{
return RedirectionStatus.CanNotRedirect;
}
等等什么?!?不允许发帖?!!?这里发生了什么?我真的不知道我做错了什么还是什么?我什至可以玩 SharePointContext.cs 吗?我真的需要有人来澄清到底发生了什么......我将不胜感激!
【问题讨论】:
-
你有没有想过这个问题? Microsoft 尚未就这种方法的工作原理提供任何更新。
-
您好,很遗憾,我还没有弄清楚,因为我必须交付我的项目,并且在与一些同事讨论后,我只使用了 HTTP GET 而不是 POST。它违反了协议,但由于 MS 在解决新技术方面的问题方面如此之快,我们别无选择。我会回到它,只有在 MS 方面进行了一些适当的更新之后......你也可以通过 Post/Redirect/Get 模式来解决它,但它实际上或多或少就像使用 GET 来代替。
-
我不确定我是否跟随。 SharePoint 正在我的应用程序上进行 POST。你是说我的应用程序必须实现一个 POST 控制器方法吗?我无法控制 sharePoint 如何重定向到我。
-
我在这里找到了另一个工作 link Nicolae Anghel
标签: asp.net-mvc-5 sharepoint-2013