実行時に OAuth を使用してプロバイダー ホスト型アドインのユーザーを承認する

実行時にプロバイダー向けのホスト型アドインで OAuth を使用して、SharePoint リソースへの承認されたアクセスを提供します。

適用対象: SharePoint 2013 | SharePoint アドイン | SharePoint Online

ユーザーは、SharePoint サイトを開き、[サイト コンテンツ] を選択してアドインを選択することで、SharePoint アドインにアクセスできます。 SharePoint では、プロバイダー ホスト型アドインを実行しているリモート Web にユーザーをリダイレクトします。 ユーザーは Sharepoint からアドインにアクセスするので、アドインにアクセスする前に SharePoint によってユーザーが承認されています。

または、ユーザーがプロバイダー ホスト型アドインの URL に直接アクセスする場合は、そのアドインは OAuth を使用して実行時に承認する必要があります。 このシナリオでは、ユーザーが最初に SharePoint によって承認されなかったので、プロバイダー ホスト型アドインが承認を処理する必要があります。 Core.DynamicPermissions サンプルでは、OAuth を使用して Web サイトからアクセス許可を動的に要求する方法を示します。 このソリューションを使用して、以下を行うことができます。

  • SharePoint からアドインへのアクセスではなく、プロバイダー ホスト型アドインに直接ナビゲートするユーザーを承認します。 たとえば、ユーザーに SharePoint UI を使用させたくない場合があります。 代わりに、ユーザーは、プロバイダー ホスト型アドインを使用して SharePoint から取得する関連データを表示します。

  • OAuth を使用してユーザーを認証でき、かつ Office ストアで販売できる、プロバイダー ホスト型アドインをビルドします。

始める前に

開始するには、GitHub の Office 365 Developer パターンとプラクティス プロジェクトから Core.DynamicPermissions サンプル アドインをダウンロードします。

コード サンプルを実行する前に、次の操作を実行してください。

  • サイトに対する [Manage] 許可があることを確認してください。 詳細については、「アクセス許可レベルについて」を参照してください。

  • AppRegNew.aspx を使用して、アドインを SharePoint サイトに登録します。

    1. SharePoint サイト上の appregnew.aspx にナビゲートします。 たとえば、contoso.sharepoint.com サイトのアドインを使用したい場合は、http://contoso.sharepoint.com/_layouts/15/appregnew.aspx にナビゲートします。

    2. [生成] を選択して、新しい [クライアント ID] を生成します。

    3. [生成] を選択して、新しい [クライアント シークレット] を生成します。

    4. アドインのタイトルを [タイトル] に入力 します

    5. [ アドイン ドメイン] に、プロバイダーホスト型アドインの URL を入力します。 たとえば、「localhost」と入力します。

    6. [ リダイレクト URI] に、プロバイダーホスト型アドインの URL を入力します。 承認と同意が与えられてから、SharePoint はこの URL にアドインをリダイレクトします。 たとえば、次のように入力します。 https://localhost:44363/Home/Callback. ドメイン名とポート番号は、Visual Studio の Core.DynamicPermissionsWeb プロジェクトの SSL URL プロパティから取得できます。

    7. [作成] を選択します。

  • クライアント ID とクライアント シークレットを Core.DynamicPermissionsWeb\web.config の appSettings 要素にコピーします。

Core.DynamicPermissions アドインを使用する

コード サンプルを実行するときには、次の操作を実行してください。

  1. [Office 365に接続] で、アドインを登録した SharePoint サイトの URL を入力し、[接続] を選択します。 たとえば、「https://contoso.sharepoint.com」と入力します。

  2. Office 365 サイトにサインインします。

  3. アドインが要求しているアクセス許可に同意を付与するように求められた場合は、[ 信頼する] を選択します。 /_layouts/15/OAuthAuthorize.aspx ページにリダイレクトされることにご注意ください。

    注:

    アドインが要求しているアクセス許可に同意を付与するには、ユーザーに 管理 アクセス許可が必要です。 詳細は、「SharePoint のアドイン用の認証コードの OAuth フロー」で説明します。

  4. [ Contoso に正常に接続されました] で、作成する新しいリストの名前を入力し、[ リストの作成] を選択します。

  5. Contoso サイト 属するすべてのリストが表示されている Contoso のリストに、新しいリストが表示されていることを確認します。

[Connect on Connect to Office 365] を選択すると、Controllers\HomeController.cs の Connect が呼び出され、TokenRepository.Connect が呼び出されます。 [Office 365 に接続] のユーザーによって入力された URL は、hostUrl として TokenRepository.Connect に渡されます。

注:

この記事で提供されるコードは、明示または黙示のいかなる種類の保証なしに現状のまま提供されるものであり、特定目的への適合性、商品性、権利侵害の不存在についての暗黙的な保証は一切ありません。

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

TokenRepository.ConnectTokenHelper.GetAuthorizationUrl を呼び出します。 TokenHelper.GetAuthorizationUrl は、hostUrl と SharePoint リソースに対して必要なアクセス許可を使用して、OAuthAuthorize.aspx へのリダイレクト URL を返します。 OAuthAuthorize.aspx は、OAuth を使用してユーザーを承認するために使用されます。 OAuthAuthorize.aspx にリダイレクトされた場合、ユーザーはOffice 365にサインインしてから、アドインが要求しているアクセス許可に同意するか、アドインを信頼する必要があります。 SharePoint リソースで必要なアクセス許可は Web.Manage です。 ユーザー認証の後に、コード サンプルは SharePoint サイトにリストを作成します。 SharePoint サイトにリストを作成するには、ユーザーが Web.Manage アクセス許可を持っている必要があります。

注:

TokenHelper.GetAuthorizationUrl、&client_id=<クライアント ID>&scope=Web.Manage&response_type=code という形式https://contoso.sharepoint.com/_layouts/15/OAuthAuthorize.aspx?IsDlg=1の URL を返します。ここで<、クライアント ID> はアドインのクライアント ID です。 アドインを販売者ダッシュボードから登録した場合は、アドインは任意の Office 365 サイトでインストールできます。 アドインを販売者ダッシュボードから登録しない場合は、appregnew.aspx を使用してアドインを登録した後で、Core.DynamicPermissionsWeb\web.config を更新する必要があります。詳細については、「Register 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 の コールバック にリダイレクトされます。これは、appregnew.aspx で指定されたリダイレクト URI です。 TokenHelper は承認コード (code) を Callback に渡します。 この記事で後述するアクセス トークンを付与するには、承認コード (code) が Callback に返される必要があります。 その後、CallbackTokenRepository.Callback を呼び出します。

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

TokenRepository.CallbackTokenCache.UpdateCacheWithCode を呼び出します。これは TokenHelper.GetAccessToken を使用して、承認コード (code) に基づく 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 サイトにリストを作成することができます。

関連項目