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