SharePointContextFilter

SharePointContextFilter

过去一周来,我一直在努力工作,无法解决针对Sharepoint提供商托管的应用程序进行正确身份验证的问题。

我目前正在为公司的Sharepoint在线开发一个sharepoint应用程序。我正在使用Visual Studio2013。我将应用程序作为云服务部署在公司的Windows Azure门户上。当我需要制作HttpPost时,一切都会顺利进行,然后该应用程序无法通过身份验证。 Controller 的设计如下:

    [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 View 。问题是,当我删除[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]的HttpGet并附加SPHostUrl = token 时,它可以工作。但是,然后我不能使用[ValidateAntiForgeryToken]。因为[SharePointContextFilter]总是检查用户的合法性,所以在这样的应用程序中甚至还需要[ValidateAntiForgeryToken]吗?我现在很困惑。网上有大量 Material 可供阅读,几乎没有什么东西可以解释何时添加这些标准 token ,何时使用[SharePointContextFilter]等。事实上,我是第一次开发Sharepoint应用程序生活,而我仅在过去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,在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;
        }

等待WHAAAT吗?!?没有开机自检?!?这里发生了什么?我真的不知道我是在做完全错误的事情还是什么?我甚至可以玩SharePointContext.cs吗?我真的需要有人弄清楚到底发生了什么...我将不胜感激!

最佳答案

上面的解决方案对我不起作用。我在邮寄方面也遇到了同样的问题,但对我来说,

return RedirectToAction("Index");

导致错误。

我将其更改为:
return RedirectToAction("Index", new {SPHostUrl = SharePointContext.GetSPHostUrl(HttpContext.Request).AbsoluteUri});

而且有效。

我不确定这是您在执行返回 View 时解决您的问题的方法,但它可能会对某人有所帮助:)

关于asp.net-mvc-5 - Sharepoint 2013 MVC 5提供程序托管的应用程序。无法使用[SharePointContextFilter]在HttpPost上进行身份验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23828750/

10-13 06:13