CurrentUser является нулевым на странице приложения Sharepoint 2010

У меня есть страница приложения, размещенная на сервере 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 не является нулевым. Итак, как я могу получить объект CurrentUser, если он не инициализирован в SPContext?

2 ответа

Получение текущего пользователя из привилегированного SPWeb внутри кода RunWithElevatedPrivileges. Попробуйте этот код.

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
       }
   }
});

Ну... лучше поздно, чем никогда. Я столкнулся с этой же проблемой сегодня. Предыдущий комментарий не касается выраженной проблемы оригинального автора. Проблема возникает, когда вы публикуете страницы.ASPX в папке _Layouts, а затем, при использовании форм или авторизации утверждений, делаете эту пользовательскую страницу вашим первым попаданием в сеансе (без ранее запомненного входа в систему). Проверка подлинности 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;
}
Другие вопросы по тегам