Sharepoint 2013 MVC 5 提供商托管的应用程序。无法使用 [SharePointContextFilter] 在 HttpPost 上进行身份验证

2024-05-08

过去一周我一直在绞尽脑汁,无法解决对共享点提供商托管的应用程序进行正确身份验证的一些问题。

我目前正在为公司的 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] 并调用帖子时,我注意到一件事,然后网址最终没有 {StandardTokens} 查询。是不是应该是这样的 - 我的意思是它类似于 hostname.com/Home/GetService,但是当我使用 actionlink 时,spcontext.js 总是将 {StandardTokens} 查询附加到基本 url - 类似于 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= 令牌时,它可以工作。但是我无法使用[ValidateAntiForgeryToken]。由于 [SharePointContextFilter] 始终检查用户的合法性,因此在这样的应用程序中是否需要 [ValidateAntiForgeryToken]?我现在很困惑。网上有大量材料可供阅读,但没有什么可以解释何时附加这些标准令牌、何时使用 [SharePointContextFilter] 等。事实上,我是第一次开发 sharepoint 应用程序。在过去的三周里,我和生活一直在研究和编码。所以我的知识还很有限,回答时请记住这一点。预先感谢,我希望我能得到一些关于发生的事情的澄清!

- - - - - - - - - - - - - - -更新 - - - - - - - - - - --------------------

好的,快速更新。我发现了一些相当奇怪的事情。 SharePoint ContextFilter Attribute.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 吗?我真的需要有人来澄清到底发生了什么......我将不胜感激!


上述解决方案对我不起作用。我在发帖时遇到了同样的问题,但对我来说这是

return RedirectToAction("Index");

导致错误。

我把它改为:

return RedirectToAction("Index", new {SPHostUrl = SharePointContext.GetSPHostUrl(HttpContext.Request).AbsoluteUri});

它起作用了。

我不确定这是否是您问题的解决方案,因为您正在执行返回视图,但它可能会对某人有所帮助:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sharepoint 2013 MVC 5 提供商托管的应用程序。无法使用 [SharePointContextFilter] 在 HttpPost 上进行身份验证 的相关文章

  • 将 .NET MVC 应用程序中的 User.Identity 映射到 Active Directory 用户

    我正在编写一个 NET MVC 5 应用程序 该应用程序位于 Intranet 上 使用 Windows 身份验证 需要查询 Active Directory 以查看哪些组可用 然后检查用户是否属于该角色 组名和用户名的来源将是活动目录 然
  • 如何使用 ASP.NET Identity (OWIN) 访问 Facebook 私人信息?

    我正在 ASP NET MVC 5 中开发一个网站 当前使用 RC1 版本 该网站将使用 Facebook 进行用户身份验证和检索初始个人资料数据 对于身份验证系统 我使用新的基于 OWIN 的 ASP NET Identity 引擎 ht
  • SQL 对密码进行哈希处理

    我使用 SQL 语句手动从旧数据导入到 MSSQL 当我从原始文本密码散列到数据库中的 MVC 5 密码 HASH 字段时 我得到有趣的字符 如何将哈希插入 mvc5 身份表 MVC 5 表也使用 nvarchar select HASHB
  • 如何验证 WPF 客户端对 ASP .NET WebAPI 2 的请求

    我刚刚创建了一个ASP NET MVC 5 Web API项目并添加了实体框架模型和其他东西以使其能够使用ASP 网络身份 http identity codeplex com 现在 我需要从 WPF 客户端应用程序创建一个对该 API 标
  • 如何在 Layout.cshtml 中设计 MVC5 全局搜索功能

    I am trying to implement a global search feature that is available above our main menu in all Views within our applicati
  • 404 页面适用于本地主机,但不适用于生产(Azure Web App)

    我的本地主机上有一个 404 页面 运行得很好 但是 当它被推送到 Azure Web App 时 却没有 我最初是通过发布工具推送它的 现在我使用从 Github 分支推送的内置功能 我有以下内容网络配置
  • ASP.NET MVC 5 和 Web API 2 .NET 要求

    我的主机提供商仅支持 NET 4 是否可以在 NET 4 计算机中运行 MVC 5 和 Web API 2 简短回答 不 您需要 NET 4 5 仅当添加依赖项时 剃须刀 v3 0 ASP NET 网页 v3 0
  • 当我尝试使用 Facebook 或 Google 登录时,GetExternalLoginInfoAsync 始终返回 null

    我有一个问题OWIN验证 我总是收到空值GetExternalLoginInfoAsync 当我尝试使用 Facebook 或 Google 登录时 但是有一些神秘的情况 当我打开 Fiddler 时 我使用这种方法得到了正确的数据 我不明
  • 扩展方法中的 HtmlAttributes

    我正在使用 MVC 5 并且正在尝试编写一些 Bootstrap 扩展方法 我的目标是 覆盖 Html ActionLink方法与Html BootstrapLinkButton The BootstrapLinkButton方法应该生成与
  • SharePoint REST 在单个 REST 查询中获取用户标题

    我有一个包含 人员和组 列的列表 当我使用 REST 查询行时 我得到此列中列出的用户 ID 我发现这篇文章将帮助我将每个 id 转换为标题 http www codeproject com Articles 692289 How to G
  • 根据控制器指定不同的_Layout.cshtml

    我创建了一个 asp mvc3 项目 我想要根据选择的控制器有不同的 Layout cshtml 这是因为控制器 1 有 2 个按钮 控制器 2 有 3 个按钮 控制器 3 有 4 个按钮 每个控制器适用于特定类型的用户 因此取决于登录 我
  • 如何使用类库中的控制器?

    我在类库中有控制器 但我无法弄清楚如何让主项目识别它们 主项目引用了我的类库 我需要在某处注册它们吗 我想同时使用控制器和 ApiController EDIT 路线配置 创建项目后未更改 public class RouteConfig
  • 将 SharePoint 用户写入 SharePoint 列表中的用户字段的正确方法

    我正在将用户写入 SharePoint 列表 我读到 SharePoint 用户字段内部有一个类似这样的字符串 userId userLoginName 在写入用户字段时 我尝试以相同的方式进行格式化 例如 当我写入此字符串时 它会起作用
  • HTML.EditorFor 添加类不起作用

    我在将 css 类添加到 HTML EditorFor 时遇到问题 我在网上搜索是否有人遇到同样的问题 但我找不到任何东西 你能帮我么 所以 这不是关于未定义类的 css 问题 而是问题 但简单地说 它没有添加到输入字段中 这是视图中的代码
  • 无法加载文件或程序集“Microsoft.ReportViewer.ProcessingObjectModel,版本=10.0.0.0”

    使用 MVC5 和 rdlc 生成 pdf 它在本地主机中工作正常 但是当我尝试生成报告时将应用程序部署到服务器时 出现错误 某些组件丢失 webapp 应用程序中的服务器错误 Could not load file or assembly
  • 通过参数mvc重定向到Action

    我想重定向到其他控制器中的操作 但它不起作用 这是我在 ProductManagerController 中的代码 HttpPost public ActionResult RedirectToImages int id return Re
  • Owin Context 每个请求使用单个实例

    app CreatePerOwinContext DataContext Create 我有上面的行来创建一个数据上下文 当我启动一个新的 MVC 5 项目时 该代码随项目一起提供 同时 我使用 autofac 在我的依赖注册器中为每个请求
  • User.Identity.GetUserId 是缓存还是每次都从数据库获取?

    我正在使用 ASP Net MVC 5 并且我在我的代码中调用这一行 string userId User Identity GetUserId ASP NET MVC 是否会在每次调用时从表中获取此数据 还是将其缓存 查看 Microso
  • 验证日期格式不起作用

    我在日期验证方面遇到问题 在我的视图中 我有一个 jQuery 日期选择器 我更改了格式yy mm dd to mm dd yy现在我收到客户端验证错误 例如 The value 02 25 2014 is not valid for Da
  • .net 4.5.1 ASP.NET MVC 5 中的用户锁定

    因此 在新的 Net Framework 4 5 1 AspNetUser 表中没有用于在有限次数的不成功尝试后将用户锁定的列 是否有为此目的构建的框架或解决方案来取代以前的 net 框架中曾经存在的功能 还是我必须自己构建 在即将发布的

随机推荐