Поделиться через


Авторизация пользователей надстроек, размещаемых у поставщика, во время выполнения с помощью OAuth

Предоставьте авторизованный доступ к ресурсам SharePoint с помощью OAuth в размещенных у поставщика надстройках во время выполнения.

Область применения: SharePoint 2013 | надстройки SharePoint | SharePoint Online

Пользователи могут получить доступ к надстройкам SharePoint, открыв сайт SharePoint, выбрав Содержимое сайта, а затем выбрав надстройку. SharePoint перенаправляет пользователей на удаленный веб-сайт, где выполняется надстройка, размещенная у поставщика. Так как пользователи получают доступ к надстройке из SharePoint, они авторизованы SharePoint, прежде чем они смогут получить доступ к надстройке.

Кроме того, если пользователи переходят непосредственно по URL-адресу надстройки, размещенной у поставщика, эта надстройка должна авторизовать их во время выполнения с помощью OAuth. В этом сценарии надстройка, размещенная у поставщика, должна обработать авторизацию, так как сначала пользователь не был авторизован SharePoint. В примере Core.DynamicPermissions показано, как динамически запрашивать разрешения с веб-сайта с помощью OAuth. Используйте это решение для следующих задач:

  • Авторизуйте пользователей, которые переходили непосредственно к надстройке, размещенной у поставщика, вместо доступа к надстройке из SharePoint. Например, вы не хотите, чтобы пользователи использовали пользовательский интерфейс SharePoint. Вместо этого пользователи могут использовать надстройку, размещенную у поставщика, которая отображает соответствующие данные, полученные из SharePoint.

  • Создайте надстройку, размещенную у поставщика, которая может проверять подлинность пользователей с помощью OAuth и продаваться через Магазин Office.

Подготовка к работе

Чтобы приступить к работе, скачайте пример надстройки Core.DynamicPermissions из проекта шаблоны и методики разработчика Office 365 на сайте GitHub.

Перед выполнением примера кода:

  • Убедитесь, что у вас есть разрешения на управление на сайте. Дополнительные сведения см. в статье Общие сведения об уровнях разрешений.

  • Зарегистрируйте надстройку на сайте SharePoint с помощью AppRegNew.aspx:

    1. Перейдите к appregnew.aspx на сайте SharePoint. Например, если вы хотите использовать надстройку на сайте contoso.sharepoint.com, перейдите по адресу http://contoso.sharepoint.com/_layouts/15/appregnew.aspx.

    2. Выберите Создать , чтобы создать новый идентификатор клиента.

    3. Выберите Создать , чтобы создать новый секрет клиента.

    4. Введите заголовок надстройки в поле Заголовок.

    5. В поле Домен надстройки введите URL-адрес надстройки, размещенной у поставщика. Например, введите localhost.

    6. В поле URI перенаправления введите URL-адрес надстройки, размещенной у поставщика. SharePoint перенаправит надстройку на этот URL-адрес после авторизации и предоставления согласия. Например, введите https://localhost:44363/Home/Callback. Доменное имя и номер порта можно получить из свойства URL-адреса SSL в проекте Core.DynamicPermissionsWeb в Visual Studio.

    7. Выберите пункт Создать.

  • Скопируйте идентификатор клиента и секрет клиента в элемент appSettings в Core.DynamicPermissionsWeb\web.config.

Использование надстройки Core.DynamicPermissions

При выполнении примера кода:

  1. В разделе Подключение к Office 365 введите URL-адрес сайта SharePoint, на который вы зарегистрировали надстройку, а затем нажмите кнопку Подключить. Например, введите https://contoso.sharepoint.com.

  2. Войдите на сайт Office 365.

  3. Если вам будет предложено предоставить согласие на разрешения, запрашиваемые надстройкой, выберите Доверять. Обратите внимание, что вы перенаправляетесь на страницу /_layouts/15/OAuthAuthorize.aspx.

    Примечание.

    Пользователь должен иметь разрешения на управление , чтобы предоставить согласие на разрешения, запрашиваемые надстройкой. Дополнительные сведения см. в статье Поток OAuth кода авторизации для надстроек SharePoint.

  4. В поле Успешно подключено к Contoso введите имя нового списка, который нужно создать, а затем выберите Создать список.

  5. Убедитесь, что в списке в Contoso отображаются все списки, принадлежащие сайту Contoso, отображается новый список.

При выборе подключенияпри подключении к Office 365 вызывается connect in Controllers\HomeController.cs, который затем вызывает TokenRepository.Connect . URL-адрес, введенный пользователем при подключении к Office 365, передается в TokenRepository.Connect в качестве hostUrl.

Примечание.

Код, приведенный в этой статье, предоставляется "как есть" без какой-либо явной или подразумеваемой гарантии, включая подразумеваемые гарантии пригодности для какой-либо цели, для продажи или гарантии отсутствия нарушения прав иных правообладателей.

 public ActionResult Connect(string hostUrl)
        {
            TokenRepository repository = new TokenRepository(Request, Response);
            repository.Connect(hostUrl);
            return View();            
        }

TokenRepository.Connect вызывает TokenHelper.GetAuthorizationUrl . TokenHelper.GetAuthorizationUrl возвращает URL-адрес перенаправления в OAuthAuthorize.aspx, используя hostUrl и требуемые разрешения на ресурс SharePoint. OAuthAuthorize.aspx используется для авторизации пользователей с помощью OAuth. При перенаправлении на OAuthAuthorize.aspx пользователь должен войти в Office 365, а затем согласиться на разрешения, запрашиваемые надстройкой, или доверять надстройке. Для ресурса SharePoint требуется разрешение Web.Manage . После авторизации пользователя пример кода создает списки на сайте SharePoint. Для создания списков на сайте SharePoint у пользователей должны быть разрешения Web.Manage .

Примечание.

TokenHelper.GetAuthorizationUrl возвращает URL-адрес в форме https://contoso.sharepoint.com/_layouts/15/OAuthAuthorize.aspx?IsDlg=1&client_id=<Идентификатор> клиента&область=Web.Manage&response_type=code, где <идентификатор> клиента — это идентификатор клиента надстройки. Если надстройка зарегистрирована на панели мониторинга продаж, ее можно установить на любом сайте Office 365. Если надстройка не зарегистрирована на панели мониторинга продаж, необходимо зарегистрировать надстройку с помощью appregnew.aspx, а затем обновить Core.DynamicPermissionsWeb\web.config. Дополнительные сведения см.в статье Регистрация надстроек SharePoint 2013.

 public void Connect(string hostUrl)
        {
            if (!IsConnectedToO365)
            {
                HttpCookie spHostUrlCookie = new HttpCookie("SPHostUrl");
                spHostUrlCookie.Value = hostUrl;
                spHostUrlCookie.Expires = DateTime.Now.AddYears(5);
                _response.Cookies.Add(spHostUrlCookie);
                _response.Redirect(TokenHelper.GetAuthorizationUrl(hostUrl, "Web.Manage"));
            }
        }

После авторизации надстройка перенаправляется на обратный вызов в Controllers\HomeController.cs, который является URI перенаправления, указанный в appregnew.aspx. TokenHelper передает код авторизации , код , в обратный вызов . Чтобы предоставить маркер доступа, описанный далее в этой статье, код авторизации , код , должен быть возвращен обратному вызову . Затем обратный вызов вызывает TokenRepository.Callback .

 public ActionResult Callback(string code)
        {
            TokenRepository repository = new TokenRepository(Request, Response);
            repository.Callback(code);
            return RedirectToAction("Index");
        }

TokenRepository.Callback вызывает TokenCache.UpdateCacheWithCode , который использует TokenHelper.GetAccessToken для получения маркера доступа OAuth на основе кода авторизации, кода .

public void Callback(string code)
        {
            HttpCookie spHostUrlCookie = _request.Cookies["SPHostUrl"];
            if (null != spHostUrlCookie)
            {
                Uri sharePointSiteUrl = new Uri(spHostUrlCookie.Value);
                TokenCache.UpdateCacheWithCode(_request, _response, sharePointSiteUrl);
            }
        }
 public static void UpdateCacheWithCode(HttpRequestBase request, HttpResponseBase response, Uri targetUri)
        {
            string refreshToken = TokenHelper.GetAccessToken(request.QueryString["code"], "00000003-0000-0ff1-ce00-000000000000", targetUri.Authority, TokenHelper.GetRealmFromTargetUrl(targetUri), new Uri(request.Url.GetLeftPart(UriPartial.Path))).RefreshToken;
            SetRefreshTokenCookie(response.Cookies, refreshToken);
            SetRefreshTokenCookie(request.Cookies, refreshToken);
        }

Теперь надстройка имеет маркер доступа для этого пользователя и может создавать списки на сайте SharePoint.

См. также