【问题标题】:Sharepoint anonymous access to layouts folder in anonymous web applicationSharepoint匿名访问匿名Web应用程序中的布局文件夹
【发布时间】:2023-03-10 04:38:01
【问题描述】:

我有一个 Sharepoint Foundation 服务器 2013,其中部署了一个 Web 应用程序、一个根站点集合和此 Web 应用程序中的另一个站点集合。 Web 应用程序配置为匿名访问,第二个网站集需要 Sharepoint 身份验证 (MS TMG)​​。

我有部署到服务器的应用程序页面(范围 = web),这些应用程序页面由用户在第二个网站集中使用,因此需要身份验证,这可以按需要工作。这些应用程序页面也必须可以匿名访问,它们当然位于_layouts 文件夹中,因此包含在根站点集合_layout 路径中,这部分不起作用。

我可以匿名访问根服务器地址https://myserver.mycompany.co.uk/ (映射到https://myserver.mycompany.co.uk/_layouts/15/start.aspx#/SitePages/Home.aspx,后者又映射到https://myserver.mycompany.co.uk/SitePages/Home.aspx)。但是我无法匿名访问https://myserver.mycompany.co.uk/_layouts/15/mysite.ApplicationPages/MyPage.aspx?QueryString=etc 它需要身份验证,当我提供身份验证时当然可以工作。

建议?需要更多信息吗?

【问题讨论】:

    标签: sharepoint permissions sharepoint-2013


    【解决方案1】:
    // This
    public partial class DoWithComment : UnsecuredLayoutsPageBase
    {
        // And this was required as well
        protected override bool AllowAnonymousAccess
        {
            get
            {
                return true;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果您的应用页面需要通过匿名访问进行访问,您的页面应继承自 Microsoft.SharePoint.WebControls.UnsecuredLayoutsPageBase 而不是 LayoutsPageBase

      见:http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webcontrols.unsecuredlayoutspagebase.aspx

      【讨论】:

      • 不,仍然需要身份验证
      • 我有一种情况,它在根站点级别运行良好(诚然,我没有使用匿名身份验证,只是试图允许用户访问 _layouts 页面,即使他们没有权限访问站点的其余部分),但对于辅助站点(挂起 /sites/ 虚拟文件夹)它拒绝工作,只是重定向到 AccessDenied.aspx 页面。不知道有人见过这样的事情吗?根站点是团队站点,辅助站点来自自定义模板,但我不明白为什么这会有所不同。
      【解决方案3】:

      除了 Colin 的 answer 之外,确实存在上述方法不起作用的情况(SharePoint 2013 with SP 1)。

      • SharePoint 是通过 Windows 身份验证访问的。
      • 用户使用 Chrome(我的版本是 35)访问页面。
      • 用户已从其他浏览器注销或用户的域登录被锁定。
      • 用户尝试访问匿名页面。
      • 用户从 Chrome 获取登录弹出窗口。

      我唯一的解决方法是创建一个 HTTP 模块来删除所有 cookie,包括 BeginRequest 上的 WSS_KeepSessionAuthenticated cookie。很可能只需要删除 WSS_KeepSessionAuthenticated,但我正在粘贴删除每个 cookie 的原始代码,因为这个问题很难重现。

      public class SPNoAuthModule : IHttpModule
      {
          public void Dispose(){ }
      
          public void Init(HttpApplication context)
          {
              context.BeginRequest+=context_BeginRequest;
          }
      
          private void context_BeginRequest(object sender, EventArgs e)
          {
              var app = (HttpApplication)sender;
              var context = app.Context;
              if (context.Request.FilePath.ToUpper().EndsWith("YOURPAGEADDRESS"))
              {
                  var cookieNames = context.Request.Cookies.AllKeys;
                  foreach (var cookieName in cookieNames)
                  {
                      context.Request.Cookies.Remove(cookieName);
                  }
              }
          }
      }
      

      当然,在 c:\inetpub\wwwroot\wss\VirtualDirectories\YOURAPPNAME: 的适当 Web.config 中注册它:

      <modules>
          <add name="YOURMODULENAME" type="YOURNAMESPACE.SPNoAuthModule, YOURASSSEMBLYNAME, Version=YOURVERSION, Culture=YOURCULTURE, PublicKeyToken=YOURKEYTOKEN" />
      </modules>
      

      【讨论】:

      • 这最初是作为对我的答案的编辑提交的,但是因为它非常具体,需要大量额外的工作并且可能会为其他开发带来其他问题,所以它被拒绝了
      猜你喜欢
      • 2011-09-10
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多