Базовая проверка подлинности Служба WCF установлена ​​в SP2010 с проверкой подлинности на основе утверждений - PullRequest
1 голос
/ 14 декабря 2010

Эта конфигурация работает с SP2010 в классическом режиме или с SP2007.

У нас есть служба WCF, которая установлена ​​в качестве приложения на веб-сайте Sharepoint.Это приложение использует обычную аутентификацию.

Я получаю UnauthorizedAccessException .Сообщение об исключении:

Доступ запрещен.(Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED)).

В отладчике я заметил, что в объекте SPWeb свойство CurrentUser равно нулю.

Что мне нужно сделать, чтобы этот пользователь с помощью обычной аутентификации мог читать списки общего ресурса?

 using (SPSite siteCollection = new SPSite(url))

        {
            using (SPWeb rootWeb = siteCollection.OpenWeb())
            {
                DataTable news = ReadNews(rootWeb, (uint)sizeNumber);

/// continues...

1 Ответ

0 голосов
/ 11 декабря 2014

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