Azure AD アプリ専用を使用してアクセスを許可するGranting access via Azure AD App-Only

SharePoint Online を使用する場合、Azure AD でアプリケーションを定義することができ、これらのアプリケーションには SharePoint へのアクセス許可だけでなく、Office 365 の他のすべてのサービスへのアクセス許可が付与されます。When using SharePoint Online you can define applications in Azure AD and these applications can be granted permissions to SharePoint, but also to all the other services in Office 365. このモデルは、SharePoint Online を使用している場合の推奨モデルです。SharePoint オンプレミスを使用している場合は、ここに記載されている Azure ACS に基づいた、SharePoint 専用のモデルを使用する必要があります。This model is the preferred model in case you’re using SharePoint Online, if you’re using SharePoint on-premises you have to use the SharePoint Only model via based Azure ACS as described in here.

重要

Azure Active Directory (Azure AD) のサービスである Azure アクセス制御 (ACS) は、2018 年 11 月 7 日に廃止されます。Azure Access Control (ACS), a service of Azure Active Directory (Azure AD), will be retired on November 7, 2018. SharePoint アドイン モデルでは、(この廃止の影響を受けない) https://accounts.accesscontrol.windows.net ホスト名を使用しているため、この廃止による影響はありません。This retirement does not impact the SharePoint Add-in model, which uses the https://accounts.accesscontrol.windows.net hostname (which is not impacted by this retirement). 詳細については、「SharePoint アドインに対する Azure アクセス制御の終了の影響」を参照してください。For more information, see Impact of Azure Access Control retirement for SharePoint Add-ins.

アプリ専用のアクセス向けに Azure AD アプリを設定するSetting up an Azure AD app for app-only access

通常、Azure AD をアプリ専用として実行している場合は、証明書を使用してアクセスを要求します。証明書とその秘密キーを持つ人は、アプリケーションと、アプリケーションに付与されたアクセス許可を使用できます。In Azure AD when doing app-only you typically use a certificate to request access: anyone having the certificate and its private key can use the app and the permissions granted to the app. 以下の手順は、このモデルの設定についての説明です。Below steps walk you through the setup of this model.

アプリ専用アクセス トークンを使用して SharePoint Online を起動するための Azure AD アプリケーションを設定する準備が整いました。You are now ready to configure the Azure AD Application for invoking SharePoint Online with an App Only access token. これを行うには、自己署名された X.509 の証明書を作成して設定する必要があります。この証明書は、アプリ専用アクセス トークンを要求しながら Azure AD に対してアプリケーションを認証するために使用されます。To do that, you have to create and configure a self-signed X.509 certificate, which will be used to authenticate your Application against Azure AD, while requesting the App Only access token. 最初に、Windows SDK で使用可能な makecert.exe ツールを使用して、または makecert に依存しない PowerShell スクリプトを使用して、自己署名された X.509 の証明書を作成する必要があります。First you must create the self-signed X.509 Certificate, which can be created using the makecert.exe tool that is available in the Windows SDK or through a provided PowerShell script which does not have a dependency to makecert. PowerShell スクリプトの使用が推奨され、この章では、その使用方法について説明します。Using the PowerShell script is the preferred method and is explained in this chapter.

重要

管理者特権で以下のスクリプトを実行することが重要です。It's important that you run the below scripts with Administrator privileges.

自己署名証明書を作成するには、このスクリプトを使用します。To create a self signed certificate with this script:

.\Create-SelfSignedCertificate.ps1 -CommonName "MyCompanyName" -StartDate 2017-10-01 -EndDate 2019-10-01

注意

日付は、米国の日付形式 (YYYY-MM-dd) で用意されています。The dates are provided in US date format: YYYY-MM-dd

ここから、実際のスクリプトをコピーできます。The actual script can be copied from here:

#Requires -RunAsAdministrator
<#
.SYNOPSIS
Creates a Self Signed Certificate for use in server to server authentication
.DESCRIPTION
.EXAMPLE
PS C:\> .\Create-SelfSignedCertificate.ps1 -CommonName "MyCert" -StartDate 2015-11-21 -EndDate 2017-11-21
This will create a new self signed certificate with the common name "CN=MyCert". During creation you will be asked to provide a password to protect the private key.
.EXAMPLE
PS C:\> .\Create-SelfSignedCertificate.ps1 -CommonName "MyCert" -StartDate 2015-11-21 -EndDate 2017-11-21 -Password (ConvertTo-SecureString -String "MyPassword" -AsPlainText -Force)
This will create a new self signed certificate with the common name "CN=MyCert". The password as specified in the Password parameter will be used to protect the private key
.EXAMPLE
PS C:\> .\Create-SelfSignedCertificate.ps1 -CommonName "MyCert" -StartDate 2015-11-21 -EndDate 2017-11-21 -Force
This will create a new self signed certificate with the common name "CN=MyCert". During creation you will be asked to provide a password to protect the private key. If there is already a certificate with the common name you specified, it will be removed first.
#>
Param(

   [Parameter(Mandatory=$true)]
   [string]$CommonName,

   [Parameter(Mandatory=$true)]
   [DateTime]$StartDate,

   [Parameter(Mandatory=$true)]
   [DateTime]$EndDate,

   [Parameter(Mandatory=$false, HelpMessage="Will overwrite existing certificates")]
   [Switch]$Force,

   [Parameter(Mandatory=$false)]
   [SecureString]$Password
)

# DO NOT MODIFY BELOW

function CreateSelfSignedCertificate(){

    #Remove and existing certificates with the same common name from personal and root stores
    #Need to be very wary of this as could break something
    if($CommonName.ToLower().StartsWith("cn="))
    {
        # Remove CN from common name
        $CommonName = $CommonName.Substring(3)
    }
    $certs = Get-ChildItem -Path Cert:\LocalMachine\my | Where-Object{$_.Subject -eq "CN=$CommonName"}
    if($certs -ne $null -and $certs.Length -gt 0)
    {
        if($Force)
        {

            foreach($c in $certs)
            {
                remove-item $c.PSPath
            }
        } else {
            Write-Host -ForegroundColor Red "One or more certificates with the same common name (CN=$CommonName) are already located in the local certificate store. Use -Force to remove them";
            return $false
        }
    }

    $name = new-object -com "X509Enrollment.CX500DistinguishedName.1"
    $name.Encode("CN=$CommonName", 0)

    $key = new-object -com "X509Enrollment.CX509PrivateKey.1"
    $key.ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
    $key.KeySpec = 1
    $key.Length = 2048 
    $key.SecurityDescriptor = "D:PAI(A;;0xd01f01ff;;;SY)(A;;0xd01f01ff;;;BA)(A;;0x80120089;;;NS)"
    $key.MachineContext = 1
    $key.ExportPolicy = 1 # This is required to allow the private key to be exported
    $key.Create()

    $serverauthoid = new-object -com "X509Enrollment.CObjectId.1"
    $serverauthoid.InitializeFromValue("1.3.6.1.5.5.7.3.1") # Server Authentication
    $ekuoids = new-object -com "X509Enrollment.CObjectIds.1"
    $ekuoids.add($serverauthoid)
    $ekuext = new-object -com "X509Enrollment.CX509ExtensionEnhancedKeyUsage.1"
    $ekuext.InitializeEncode($ekuoids)

    $cert = new-object -com "X509Enrollment.CX509CertificateRequestCertificate.1"
    $cert.InitializeFromPrivateKey(2, $key, "")
    $cert.Subject = $name
    $cert.Issuer = $cert.Subject
    $cert.NotBefore = $StartDate
    $cert.NotAfter = $EndDate
    $cert.X509Extensions.Add($ekuext)
    $cert.Encode()

    $enrollment = new-object -com "X509Enrollment.CX509Enrollment.1"
    $enrollment.InitializeFromRequest($cert)
    $certdata = $enrollment.CreateRequest(0)
    $enrollment.InstallResponse(2, $certdata, 0, "")
    return $true
}

function ExportPFXFile()
{
    if($CommonName.ToLower().StartsWith("cn="))
    {
        # Remove CN from common name
        $CommonName = $CommonName.Substring(3)
    }
    if($Password -eq $null)
    {
        $Password = Read-Host -Prompt "Enter Password to protect private key" -AsSecureString
    }
    $cert = Get-ChildItem -Path Cert:\LocalMachine\my | where-object{$_.Subject -eq "CN=$CommonName"}

    Export-PfxCertificate -Cert $cert -Password $Password -FilePath "$($CommonName).pfx"
    Export-Certificate -Cert $cert -Type CERT -FilePath "$CommonName.cer"
}

function RemoveCertsFromStore()
{
    # Once the certificates have been been exported we can safely remove them from the store
    if($CommonName.ToLower().StartsWith("cn="))
    {
        # Remove CN from common name
        $CommonName = $CommonName.Substring(3)
    }
    $certs = Get-ChildItem -Path Cert:\LocalMachine\my | Where-Object{$_.Subject -eq "CN=$CommonName"}
    foreach($c in $certs)
    {
        remove-item $c.PSPath
    }
}

if(CreateSelfSignedCertificate)
{
    ExportPFXFile
    RemoveCertsFromStore
}

秘密キーを暗号化するためのパスワードを入力するように求められ、.PFX ファイルと .CER ファイルの両方が現在のフォルダーにエクスポートされます。You will be asked to give a password to encrypt your private key, and both the .PFX file and .CER file will be exported to the current folder.

次の手順では、Office 365 テナントにリンクされている Azure Active Directory テナントに Azure AD アプリケーションを登録します。Next step is registering an Azure AD application in the Azure Active Directory tenant that is linked to your Office 365 tenant. これを行うには、テナントのグローバル管理者グループのユーザー メンバーのアカウントを使用して Office 365 管理センター (https://portal.office.com)) を開きます。To do that, open the Office 365 Admin Center (https://portal.office.com) using the account of a user member of the Tenant Global Admins group. Office 365 管理センターの左側のツリー ビューにある [管理センター] グループの下にある [Azure AD] リンクをクリックします。Click on the "Azure AD" link that is available under the "Admin centers" group in the left-side treeview of the Office 365 Admin Center. 開かれる新しいブラウザーのタブに、Microsoft Azure portal が表示されます。In the new browser's tab that will be opened you will find the Microsoft Azure portal. アカウントで初めて Azure portal にアクセスする場合は、新しい Azure サブスクリプションを登録する必要があります。また、発生する支払いのために、いくつかの情報の提供とクレジットカードが必要となります。If it is the first time that you access the Azure portal with your account, you will have to register a new Azure subscription, providing some information and a credit card for any payment need. ただし、Azure AD を試用し、Office 365 アプリケーションを登録する場合は、支払いは発生しませんのでご安心ください。But don't worry, in order to play with Azure AD and to register an Office 365 Application you will not pay anything. 実際、これらの機能は無料で使用することができます。In fact, those are free capabilities. Azure portal にアクセスしたら、[Active Directory] セクションを選択し、[アプリの登録] オプションを選択します。Once having access to the Azure portal, select the "Active Directory" section and choose the option "App Registrations". 詳細については、次の図を参照してください。See the next figure for further details.

Azure AD ポータルを表示する

[アプリの登録] タブには、テナントに登録されている Azure AD アプリケーションのリストがあります。In the "App Registrations" tab you will find the list of Azure AD applications registered in your tenant. ブレードの左上部にある [新しいアプリケーションの登録] ボタンをクリックします。Click the "New application registration" button in the upper left part of the blade. 次に、アプリケーションの名前を入力し、[Web アプリ/ API] オプションを選択し、[サインオン URL] に URL (たとえば、https://www.pnp.com) など、存在しない URL でも可) を入力します。Next, provide a name for your application, select the option "Web app / API", and fill in the "Sign-on URL" with a URL (does not have to exist, e.g. https://www.pnp.com). [作成] をクリックして、Azure AD アプリケーションを作成します。Click on “Create” to create the Azure AD application.

新しい Azure AD アプリケーションを作成する

作成したら、Azure AD アプリケーションをもう一度検索して開く必要があります。Once created you need to look up your Azure AD application again and open it:

ポータルから新しい Azure AD アプリケーションを開く

重要

アプリケーションを開いたら、アプリケーション ID をコピーします。この ID は後で必要になります。Once the application has been opened copy the application ID as you’ll need it later.

[必要なアクセス許可] をクリックし、[追加] ボタンをクリックすると、新しいブレードが表示されます。Now click on "Required Permissions", and click on the "Add" button, a new blade will appear. 次のアクセス許可を構成する必要があります: You need to configure the following permissions:

  • Office 365 SharePoint Online (アプリケーションのアクセス許可)Office 365 SharePoint Online (Application Permission)
    • 管理されたメタデータの読み取りおよび書き込みRead and write managed metadata
    • すべてのサイト コレクションのフル コントロールHave full control of all site collection

"アプリケーションのアクセス許可" は、アプリ専用として実行している際にアプリケーションに付与されるものです。The "Application Permissions" are those granted to the application when running as App Only.

Azure AD アプリケーションへのアクセス許可の付与

最後の手順で、前に作成した証明書をアプリケーションに “接続” します。Final step is “connecting” the certificate we created earlier to the application. Get-SelfSignedCertificateInformation.ps1 スクリプトを実行する必要があります。You need to execute the Get-SelfSignedCertificateInformation.ps1 script.

.\Get-SelfSignedCertificateInformation.ps1 | clip

ここから、実際のスクリプトをコピーできます。The actual script can be copied from here:

$certPath = Read-Host "Enter certificate path (.cer)"
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import($certPath)
$rawCert = $cert.GetRawCertData()
$base64Cert = [System.Convert]::ToBase64String($rawCert)
$rawCertHash = $cert.GetCertHash()
$base64CertHash = [System.Convert]::ToBase64String($rawCertHash)
$KeyId = [System.Guid]::NewGuid().ToString()

$keyCredentials = 
'"keyCredentials": [
    {
      "customKeyIdentifier": "'+ $base64CertHash + '",
      "keyId": "' + $KeyId + '",
      "type": "AsymmetricX509Cert",
      "usage": "Verify",
      "value":  "' + $base64Cert + '"
     }
  ],'
Write-Host $keyCredentials

Write-Host "Certificate Thumbprint:" $cert.Thumbprint

AppOnly コンテキスト構成の証明書を生成したときに作成した .CER ファイルの完全修飾パスを指定する必要があります。You will have to provide the full qualified path of the .CER file that you created when you created the certificate for the AppOnly context configuration. このコマンドは、今後の手順で使用する JSON スニペットをクリップボードにコピーします。The command will copy into the clipboard a JSON snippet that you will use in the upcoming steps. クリップボードの内容を安全な場所 (新しいメモ帳のファイルなど) に貼り付けます。Paste the content of the clipboard in a safe place (like a fresh new notepad file).

前の手順で作成した Azure AD アプリケーションに戻って、ブレードの上部にある [マニフェスト] ボタンをクリックし、[編集] をクリックします。Go back to the Azure AD Application that you created in the previous step and click the "Manifest" button at the top of the blade, then click Edit'. keyCredentials プロパティを検索し、以前に生成したスニペットと置き換えます。そうすると次のようになります。Search for the keyCredentials property and replace it with the snippet you generated before, this will be like:

  "keyCredentials": [
    {
      "customKeyIdentifier": "<$base64CertHash>",
      "keyId": "<$KeyId>",
      "type": "AsymmetricX509Cert",
      "usage": "Verify",
      "value":  "<$base64Cert>"
     }
  ],

この手順が完了したら、[保存] をクリックします。Click Save when you complete this step.

このサンプルでは、Sites.FullControl.All のアプリケーションのアクセス許可は、使用する前に、テナントの管理者の許諾を必要とします。In this sample the Sites.FullControl.All application permission require admin consent in a tenant before it can be used. 次のような許諾 URL を作成します。Create a consent URL like the following:

https://login.microsoftonline.com/<tenant>/adminconsent?client_id=<application id>&state=<something>

Azure AD アプリのアプリケーション ID を使用し、自分のテナント contoso.onmicrosoft.com からアプリを許諾する場合、URL は次のようになります。Using the application id from my Azure AD app and consenting to the app from my tenant contoso.onmicrosoft.com, the URL looks like this:

https://login.microsoftonline.com/contoso.onmicrosoft.com/adminconsent?client_id=6e4433ca-7011-4a11-85b6-1195b0114fea&state=12345

作成された URL の場所へ移動し、テナント管理者としてログインし、アプリケーションを許諾します。Browsing to the created URL and log in as a tenant admin, and consent to the application. アプリケーションの名前と、構成したアクセス許可スコープが許諾画面に表示されます。You can see the consent screen show the name of your application as well as the permission scopes you configured.

Azure AD アプリケーションへのアクセス許可の付与

注意

[承諾] をクリックすると、以前に指定したサインイン URL (今回の例では https://www.pnp.com) にリダイレクトされます。この URL が有効でない場合、リダイレクトは失敗しますが、アクセス許可の付与は正常に終了していますので、心配する必要はありません。After clicking “Accept” you’re redirected to the sign-in URL you specified earlier (https://www.pnp.com in our case) …if that URL is not valid the redirect will fail but the grant was done successful, so nothing to worry about.

SharePoint の PnP サイト コア ライブラリを使用して、アプリケーションでこのプリンシパルを活用するUsing this principal in your application using the SharePoint PnP Sites Core library

まず、SharePoint PnP コア オンライン ライブラリの NuGet パッケージ (https://www.nuget.org/packages/SharePointPnPCoreOnline) を追加します。In a first step, you add the SharePointPnPCoreOnline library nuget package: https://www.nuget.org/packages/SharePointPnPCoreOnline. 完了したら、以下のコード コンストラクターを使用できます。Once that’s done you can use below code construct:

using OfficeDevPnP.Core;
using System;

namespace AzureADCertAuth
{
    class Program
    {
        static void Main(string[] args)
        {
            string siteUrl = "https://contoso.sharepoint.com/sites/demo";
            using (var cc = new AuthenticationManager().GetAzureADAppOnlyAuthenticatedContext(siteUrl, "<application id>", "contoso.onmicrosoft.com", @"C:\BertOnlineAzureADAppOnly.pfx", "<password>"))
            {
                cc.Load(cc.Web, p => p.Title);
                cc.ExecuteQuery();
                Console.WriteLine(cc.Web.Title);
            };
        }
    }
}

FAQFAQ

Azure AD アプリのアプリ専用アクセスを実現するために、証明書以外の方法を使用できますか?Can I use other means besides certificates for realizing app-only access for my Azure AD app?

いいえ、他のすべてのオプションは SharePoint Online によってブロックされ、アクセス拒否メッセージが表示されます。No, all other options are blocked by SharePoint Online and will result in an Access Denied message.