Sharepoint 2010应用程序页面上的CurrentUser为空

时间:2012-04-20 12:36:23

标签: c# sharepoint-2010 spcontext

我有应用程序页面,托管在Sharepoint服务器上(例如http://myportal/mysite/_layouts/application/default.aspx),其代码如下:

protected void Page_PreLoad(object sender, EventArgs e)
{           
    var userEmail = SPContext.Current.Web.CurrentUser.Email;
}

如果用户在浏览器启动后尝试通过URL直接获取此页面,则会出现异常,因为CurrentUser为null。 但如果用户首先导航到网站(http:// myportal / mysite)然后导航到应用程序页面,则CurrentUser不为null。 那么,如果没有在SPContext中初始化它,我如何获得CurrentUser对象?

2 个答案:

答案 0 :(得分:0)

从RunWithElevatedPrivileges代码中的提升的SPWeb获取当前用户。 试试这段代码。

SPWeb site = SPContext.Current.Web;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
    using (SPSite ElevatedsiteColl = new SPSite(site.Url))
   {
       using (SPWeb ElevatedSite = ElevatedsiteColl.OpenWeb())
       {
            SPUser currUser = site.CurrentUser; //not the ElevatedSite.CurrentUser
       }
   }
});

答案 1 :(得分:0)

嗯...迟到总比没有好。我今天遇到了同样的问题。之前的评论没有解决原始海报所表达的问题。当您在_Layouts文件夹中发布.ASPX页面时会出现问题,然后,在使用Forms或Claims auth时,使该自定义页面成为会话中的第一个页面(之前没有记住登录)。默认情况下不会触发SharePoint身份验证(即使您从LayoutsPageBase类继承)。如果您导航到其他某个SharePoint页面(例如_Layouts / 15 / Settings.aspx)然后返回,则会填充CurrentUser 。我必须使用Reflector来更好地了解正在进行,以及如何解决它。简短的回答是,一旦你意识到CurrentUser == null,你需要添加这行代码:

Microsoft.SharePoint.Utilities.SPUtility.HandleAccessDenied(new UnauthorizedAccessException());

在我的情况下,此代码生成对浏览器的质询/响应,我曾经登录过,并且紧跟在这行代码之后,CurrentUser对象被正确填充。这是我的整个功能最终看起来像:

public static bool isAdminAuthorized()
{
    Microsoft.SharePoint.SPContext oContext ;
    Microsoft.SharePoint.SPWeb oWeb ;
    Microsoft.SharePoint.SPUser oUser ;
    try
    {
        oContext = Microsoft.SharePoint.SPContext.Current;
    }
    catch { throw new Exception("Can't obtain Sharepoint Context!"); }
    try
    {
        oWeb = oContext.Web;
    }
    catch { throw new Exception("Can't obtain Sharepoint web!"); }
    try
    {
        oUser = oWeb.CurrentUser;
    }
    catch { throw new Exception("Can't obtain Sharepoint current user!"); }
    if (oUser == null)
    {
        Microsoft.SharePoint.Utilities.SPUtility.HandleAccessDenied(new UnauthorizedAccessException());
        oUser = oWeb.CurrentUser;
    }
    foreach (Microsoft.SharePoint.SPGroup oGroup in oUser.Groups)
    {
        if (oGroup.Name.ToUpper().Contains("OWNER"))
        {
            return true;
        }
    }
    return false;
}