SharePoint Add-ins 2013 (オンプレミス; on-premise) にTenant Scopeでリリース時にエラーになる

はじめに

SharePoint Add-insにテナント(Tenant) Scope で、権限の追加時に、以下のエラーが出る場合があります。

英語
Sorry, only tenant administrators can add or give access to this app
日本語
申し訳ございません。このアプリへのアクセス許可を追加または付与できるのは、テナント管理者のみです。

その場合には、ファーム管理者に追加する必要があります。

詳細

例)AppManufest に テナント(tenant)に[Full Control]を設定します

tenant-onpremise0010

デバック実行すると以下のメッセージが表示されます。
「申し訳ございません。このアプリへのアクセス許可を追加または付与できるのは、テナント管理者のみです。」

tenant-onpremise0020

[SharePoint全体管理]の[セキュリティ]をクリックする

tenant-onpremise0030

[Farm Administratore(ファーム管理者)]にVisual Studioを実行しているユーザを追加します。

tenant-onpremise0040

IISをリセットする

[PowerShell]を[管理者として実行する]

[Iisreset]コマンドを入力する

tenant-onpremise0050

再度[Visual Studio]で[デバック実行]する
Farm Administratorの権限が付与されているので、メッセージが以下に代わります
「すべてのサイトコレクションのフルコントロールを許可します。」

tenant-onpremise0060

結果、以下のように SharePoint Provider-hosted からSharePointにアクセスできています

tenant-onpremise0070

参考

  1. Apps using tenant scope permissions in a local site

 

 

 

SharePoint Add-ins 2013 (オンプレミス; on-premise) とVisual StuidoでのProvider-hosted アプリデバックの環境(enviroment)

はじめに

[SharePoint2013] on-premiseで[SharePoint Add-ins]を動作させるためには

SharePoint-hosted」か「high-trust な Provider-hosted(高信頼アプリ)」のどちらかになります。

  1. SharePoint-hosted」の場合は
    hostedされるURLが別名になります(実際にはSharePointです)ので、DNSやSharePointの「アプリ URL の構成」をする必要があります。
    はまる、App for SharePoint 2013 (オンプレミス; on-premises) とVisual Stuidoでのsharepoint hoted apps アプリデバックの環境(enviroment)
  2. 「high-trust な Provider-hosted(高信頼アプリ)」の場合は
    [自己証明書 or 商用証明書]を使用してProvider-hosted(WebSite)を信頼済み(SecurityTokenService)にしなければいけません。信頼済みにしないとエラーになります。

詳細(high-trust な Provider-hosted(高信頼アプリ))

  1. 自己署名入り証明書の作成する。
    sp-provider-onpre0010
  2. 証明書のフレンドリ名を指定する
    sp-provider-onpre0020
  3. 証明書をエクスポートする
    ※pfx :後でVisual Studioにpfx(秘密キー入り証明書)を読み込ませます
    例)
    場所  [C:\Certs\HighTrustSampleCert.pfx]
    password [password]
    sp-provider-onpre0030
  4. .cer(秘密キーのない証明書)も作ります。
    ※.cer :後で、[SharePoint Security Token Service]に秘密キーのない証明書を読み込ませます
    作成した証明書をダブルクリック
    sp-provider-onpre0040
    詳細タブのファイルコピーをクリックする
    sp-provider-onpre0050
    秘密キーをエクスポートしません。
    sp-provider-onpre0060
    保存します。
    例)
    場所  [C:\Certs\HighTrustSampleCert.cer]
    sp-provider-onpre0070
    結果以下のようになります。
    sp-provider-onpre0080
  5. SharePoint Security Token Service の構成を行います。
    注意:specificIssuerId はGUIDを自分で生成する必要があります。
    以下を[SharePoint2013 管理シェル]を管理者から起動して実行します。

    $publicCertPath = "C:\Certs\HighTrustSampleCert.cer"
    $certificate = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($publicCertPath)
    
    
    New-SPTrustedRootAuthority -Name "HighTrustSampleCert" -Certificate $certificate 
    
    $realm = Get-SPAuthenticationRealm
    
    
    $specificIssuerId = "11111111-1111-1111-1111-111111111111"
    $fullIssuerIdentifier = $specificIssuerId + '@' + $realm 
    
    
    New-SPTrustedSecurityTokenIssuer -Name "High Trust Sample Cert" -Certificate $certificate -RegisteredIssuerName $fullIssuerIdentifier –IsTrustBroker
    iisreset 
    
    
    $serviceConfig = Get-SPSecurityTokenServiceConfig
    $serviceConfig.AllowOAuthOverHttp = $true
    $serviceConfig.Update()
  6. Visual Studioで[SharePoint Add-ins] [Provider-hosted]アプリを作成します。
    ※[Visual Studio] は[管理者と実行]すること

    1. 新しいプロジェクト
      sp-provider-onpre0090
    2. プロバイダー向けのホスト型
      ※SharePointのサイトはDeveloperサイトのテンプレートで作成したサイトにして下さい
      sp-provider-onpre0100
    3. SharePoint2013にします。
      ※DLLのバージョンがonline, on-premiseと異なりますので注意して下さい
      sp-provider-onpre0105
    4. [ASP.NET Webフォーム アプリケーション], [ASP.NET MVC Web アプリケーション]どちらでもよいです。
      sp-provider-onpre0110
    5. [アプリの認証方法]で証明書を使用する(高信頼性が必要なSharePoint設置型アプリの場合)
      例
      [証明書の場所(秘密キー込み)]: [C:\Certs\HighTrustSampleCert.pfx]
      [パスワード]: password
      [発行者 ID]: 11111111-1111-1111-1111-111111111111

      sp-provider-onpre0120

    6. プロジェクトを作成後[Web.config]を確認すると以下のようになっています。
      sp-provider-onpre0130
    7.  デバック実行してみます。(F5)
      IEが起動するので、[信頼する]をクリックする
      sp-provider-onpre0140
    8. 以下のように標準テンプレートのサンプルが表示され、名前をSharePointから取得しています。
      sp-provider-onpre0150
  7. テストが終わり本番にリリースする際に証明書の入れ替えについては
    以下のサイトの「ドメインが発行した証明書または商用証明書を使用してデバッグを完了する」を参考にして下さい
    SharePoint の高信頼性アドインを作成する

参考

  1. SharePoint Add-ins: On-Premises と Office 365 で動く Add-in を作成するには (Authentication)
  2. SharePoint の高信頼性アドインを作成する
  3. Create high-trust SharePoint Add-ins
  4. はまる、App for SharePoint 2013 (オンプレミス; on-premises) とVisual Stuidoでのsharepoint hoted apps アプリデバックの環境(enviroment)
  5. SharePoint2013+VisualStudio2013 配置手順 ‘IIS アプリケーション プールのリサイクル’ でエラー

Tokyo ComCamp 2016 powered by MVPs で登壇しました。

予約ページ  Tokyo ComCamp 2016 powered by MVPs – connpass

株式会社gloopsさんにて、Office365 の開発について登壇を行いました。

Office365の開発は、ユーザ数が増えて、開発者も増えてきました。

機能が多いので、開発手法についてデモを交えながら、説明しました。

詳しい方もいたので、Office365について知識が深まりました。

 

ComCamp2016

 

スライド


 

SharePoint AccessToken/RefreshToken

この記事は書きかけです。

いくつかSharePoint Add-insを作成していて、気が付いた点をメモします。

SharePoint AccessToken/RefreshToken いくつかポイントがあるのですが、わかる範囲で記載しておきます。

Access Tokenの種類

参考

Inside SharePoint 2013 OAuth Context Tokens

ACS 00000001-0000-0000-c000-000000000000
Exchange 00000002-0000-0ff1-ce00-000000000000
SharePoint 00000003-0000-0ff1-ce00-000000000000
Lync 00000004-0000-0ff1-ce00-000000000000
Workflow 00000005-0000-0000-c000-000000000000

 

AccessTokenの有効期限は1時間

実際にテストをする約1時間(2015/08/10時点)でした。

AccessTokenが期限切れになりましたら、RefreshToken(おそらく有効期限が長いはず)でAccessTokenを再取得します。

 

参考

松崎さんBlog

Native Application (Mobile App) で Azure Active Directory に Login するプログラミング (OAuth 紹介)

また、Access Token の有効期限は、約 1 時間です。Access Token が期限切れになった場合にも、上記の通り Refresh Token を使って Access Token を取得しなおします。
補足 : refresh token は最大 14 日使用可能で、再取得することで、さらに 14 日間使用できます。(最大で 90 日まで使用できます。)

 

Micrsosft Sample
Office 365 API Tools を使用したプログラミング

Access Token と Refresh Token
アプリケーションが Exchange のサービスに接続する際、内部で Access Token と呼ばれる文字列が使用されています。この Access Token を使用して、アプリケーションは、その他の処理も継続して実行できます。
また、Access Token には有効期限があり、1 時間で使用できなくなりますが、この場合は Refresh Token と呼ばれるものを使用して、再度、Access Token を取り直します。
上記の AcquireTokenSilentAsync では、こうした面倒なトークンの扱いも自動化してくれています。
また、Access Token や Refresh Token をキャッシュしてアプリケーション終了後もこの値を保持することで、同じアカウント情報で継続して利用することが可能です。(上記のサンプルでは、このキャッシュの処理はおこなっていません。)

 

野呂清二

Making SharePoint Add-ins + Azure Session

こんにちは野呂です。

SharePoint Add-insのSession(セッション)管理でクラスの一部でシリアル化がうまく出来ない問題がありますので、解決策を一番下にリンクしました。

解説

SharePoint Add-ins でアプリを作成してリリースすると、そのままテンプレートを使用すると下記のエラーがでます。

セッション状態をシリアル化できません。’StateServer’ および ‘SQLServer’ モードでは、ASP.NET はセッション状態オブジェクトをシリアル化します。その結果、シリアル化できないオブジェクトまたは MarshalByRef オブジェクトは許可されません。’Custom’ モードのカスタム セッション状態ストアによって類似したシリアル化が実行される場合、同一の制限が適用されます

 

Web.config のSession は、なにも記述されていないので、”InProc” になっています。

なので、”Azure Redis Cache” 、”SQL Server”, “ASP.NET Universal Providers and Session State”等を使用してセッションを保持する仕組みを設定する必要があります。

しかしながら、SharePoint のToken/RefreshToken 管理クラスである。

いくつかのAccessToken管理クラス(SharePointContext他)は標準ではSeriazaibleではありませんので、InProc以外のセッションのSQL Azure, Redis Cache、等はクラスをシリアル化しなければならないです。

しかしながら、いくつかのクラスはライブラリ(dll)の中に定義してありシリアル化の定義ができないので、プログラムを別途作る必要があります。

MSDNにサンプルがありました。私も、実際に Universal Providers でテストしてOKでした。

参考までにどうぞ

Making SharePoint Apps Scale with Azure Redis Cache

野呂清二

SharePoint 一覧ツール to EXCEL

SharePoint でサイトコレクションから、全てのサブサイトとリストをExcelに出力するツールです。
WSS3, MOSS2007, 2010, 2013のオンプレミスにて出力できます。

・※Online(Office365)については開発テスト中
・※Form Based Authentication(フォーム認証)については開発テスト中

イメージ

SPWebList010

 

出力されるExcelの項目

項目名 意味
WebSite サブサイト
WebSiteCount サブサイトの数
ListCount リストの数
Title リストのタイトル
BaseType リストのタイプ
ServerTemplate リストのテンプレート
ItemCount リストのアイテム数
ID リストのID
Description リストの詳細
DocTemplateUrl
DefaultViewUrl
MobileDefaultViewUrl
FeatureId
Created リストの作成日
LastDeleted
Version

SharePoint2013  開発メモ

前回はSharePoint2013アプリの登録に関して記載いたしましたが
今回は開発にあたり、はまりそうな所を記載していきます。

ファイルの情報を取得するまでの流れ

SharePoint2013は

  1. サイト(サブサイト含む)
  2. リスト(ドキュメント・マイクロフィードなど)
  3. リストアイテム(フォルダ・ファイルなど)

のような感じで情報が管理されており、ファイル等のリストアイテムを取得したい場合は
1から順番に情報を取得する必要があります。

それぞれ対応するクラスは下記になります。

サイト WebCollectionクラス
リスト ListCollectionクラス
リストアイテム ListItemCollectionクラス

eoe20150310
Exceed One Explorer
※SharePointのアイコンの階層がサイト、「サイトのページ」などの階層がリスト、その他はリストアイテムから取得できます。

 

リストアイテムを見ないとファイルの場所がわからない?

リストには階層情報を保持していないため、ファイルの場所が分かりません。
リストからファイルがある場所を知りたい場合は以下のようなルールになっている模様なので、参考にしていただければと思います。

foreach(List list in (ListCollection)){
  if(!String.IsNullOrEmpty(list.DocumentTemplateUrl)){
/*
    list.DocumentTemplateUrlを「/」で分解してForms階層の上の階層にファイルがある
*/
  }
  if(list.EntityTypeName.IndexOf("List")!=-1){
/*
    エンティティ名の後ろにListが含まれているときは
    Lists/(Listを除去したエンティティ名)/
    にファイルがある。
    list.EntityTypeNameは、スペースなどの文字を「_x0020_」で保持しているため、必要に応じて変換する。*/
  }
}

SharePoint上にあるOfficeファイルをOfficeOnlineで編集させたい

Office2013がインストールされているWindowsPCであれば、Office2013用ファイルがあるURLにアクセスした際Office2013がSharePoint2013と通信して作業することが可能ですが、
Web上で編集したい場合OfficeOnlineで読み込めるものであれば、OfficeファイルURLの後ろに ?d=w(ハイフンを抜いたファイルの固有ID)にアクセスすると、OfficeOnlineが起動しWeb上で操作ができます。

 

アプリを起動して放置していたらJSON通信を行うアプリでエラーが出る

SharePointContextFilterを使用している場合はデフォルトでセッションが20分で切れ、コンテキストトークン値がセッションから破棄されます。
セッションが切れた場合、アクセストークン及びリフレッシュトークンが有効期間内でもエラーになりますので、
あらかじめ下記のようにセッションの有効期限を設定します。
Web.configのsystem.web項目に
<sessionState timeout=”(有効期限/分)”/>
を追加すると解決します。

※C#でセッション有効時間を確認したい場合、HttpContextBase.Session.Timeoutで確認できます。
※Azure websitesでは、sessionStateがInProcモードの場合、指定した時間前でもセッションが破棄されるケースがありますので注意してください。

SharePoint2013+VisualStudio2013 配置手順 ‘IIS アプリケーション プールのリサイクル’ でエラー

SharePoint2013+VisualStudio2013(Deploy)配置手順 ‘IIS アプリケーション プールのリサイクル’ でエラーが出力される場合の対処方法

1.Visual Studio 2013で以下のメッセージが表示される。

sp2013apppool001

配置手順 ‘IIS アプリケーション プールのリサイクル’ でエラーが発生しました: ローカル SharePoint サーバーを使用できません。サーバーが実行されており、SharePoint ファームに接続されていることを確認してください。

2. また、SharePoint管理シェル(PowerShell)起動時に、以下のメッセージが表示される。

ローカルファームにアクセスできません。Feature DependencyIDが指定されたコマンドレットは登録されていません

対処方法

現在のログインユーザでデータベースに権限を追加する。

  1. SQL Serversaもしくは管理者権限のあるWindowsログインユーザにてSQL Server Manegement Studioにログインする。
  2. SQL ServerVisual Studio(もしくはPowerShell)を実行したいWindowsログインユーザを追加する。
    sp2013apppool002
  3. 追加したWindowsログインユーザに以下のサーバロールを追加する。
    dbcreator
    public
    securityadmin
    sysadmin
    sp2013apppool003
  4. SharePoint_Config 等のDatabaseにアクセスできるようになり、それによって表題のエラーも解消されます。
    sp2013apppool004

プロバイダー向けのホスト型のSharePoint2013SharePointアプリ登録方法

SharePoint2013とMicrosoft Azureを連携させたアプリを開発するにあたり、連携部分において嵌りやすいので、
SharePointアプリをサイトコンテンツに設定するまでの方法をまとめてみました。

手順

  1. サイトコレクションを作成
  2. 作成したサイトコレクションで新しいアプリの登録
  3. Microsoft Azureの設定
  4. VisualStudio2013 プロジェクトの設定
  5. WebのパッケージをMicrosoft Azureに配置
  6. SharePoint2013用アプリの発行

1.サイトコレクションを作成

SharePoint2013 /Office365(SP2013)でサイトコレクションを作成する。
の「Office365(SharePoint2013)の場合」の方法で作成します。

2.作成したサイトコレクションで新しいアプリの登録

SharePointアプリをVisualStudio2013上で起動したときはクライアントIdが固定ではないため、
固定のクライアントIDとクライアントシークレットを生成する必要がある。

https://(サイトコレクションのアドレス)/_layouts/15/AppRegNew.aspx
にアクセスすると次の画面が表示される。
sharepoint_appregnew

アプリの種類
Webサーバーで実行中のアプリ

クライアントID
「生成」ボタンを押下すると自動で値が入る

クライアントシークレット
「生成」ボタンを押下すると自動で値が入る

タイトル
登録するアプリケーションのタイトル

アプリドメイン
アプリを配置するドメイン(Webのパッケージを配置するドメイン)

リダイレクト先のURI
SharePointから呼び出すURI(Webのパッケージを配置している場所を指定。HTTPS必須)

「作成」ボタンを押下すると、正常に作成された場合は作成された情報が画面に表示される。
作成完了の画面は一度きりの表示で後で確認できないため、記載されている情報は必ずメモを取ること。

3.Microsoft Azureの設定

アプリ登録で生成したクライアントIDとクライアントシークレットの登録を行う。

sharepoint_azure_1

この画面からタブの「構成」を押下して「アプリケーション設定」項目までスクロールする。

sharepoint_azure_2

初期ではWEBSITE_NODE_DEFAULT_VERSIONだけ入っているので、
ClientIdと、ClientSecretの2行を追加し、
アプリの登録で作成したクライアントIDとクライアントシークレットをそれぞれ設定する。
設定後は画面下にある「保存」ボタンを押下し、Microsoft Azureに反映させる。

4.VisualStudio2013プロジェクトの設定

SharePoint側、Web側の設定をそれぞれ行う。

AppManifest.xml

<Properties>
  <Title>TITLE</Title>
  <StartPage>https://localhost:44302/?{StandardTokens}</StartPage>
</Properties>
<AppPrincipal>
  <RemoteWebApplication ClientId="*" />
</AppPrincipal>
StartPageの「https://localhost:44302/」をアプリ登録で指定したリダイレクト先URIに変更する。
次にClientIdにアプリの登録で作成したクライアントIDを登録する。

 Web.config

<appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <add key="ClientId" value="********-****-****-****-************" />
    <add key="ClientSecret" value="********+**********/********************+**=" />
</appSettings>

ClientIdと、ClientSecretの欄に
アプリの登録で作成したクライアントIDとクライアントシークレットをそれぞれ設定する。

 

5.WebのパッケージをMicrosoft Azureに配置

sharepoint_azure_3

VisualStudio2013のソリューションエクスプローラWebアイコンを右クリックし、
ポップアップメニューから「発行」を選んだ後 配置先を適切に指定し、画面右下にある「発行」ボタンを押下する。

6.SharePoint2013用アプリの発行

sharepoint_regist_3

VisualStudio 2013のソリューションエクスプローラのSharePointアイコンをクリックし、
プロパティのWebプロジェクトを「なし」に設定する。

sharepoint_regist_1

VisualStudio2013のソリューションエクスプローラのSharePointアイコンを右クリックし、ポップアップメニューから「発行」を選んだ後
「アプリをパッケージ化する」ボタンを押下する。押下すると生成先のフォルダが表示される。

sharepoint_regist_2

生成された拡張子がappのファイルをSharePoint用アプリにアップロードを行う。
正常に登録されるとアプリがサイトコンテンツに追加される。

sharepoint

追加されたアプリ(赤丸)をクリックし、リダイレクト先のURIへ遷移してエラーが出なければ完了。

How to get Tenant SiteCollection on SharePoint online(Office365)

SharePointOnline(Office365) の
テナントレベルのサイトコレクション等をアプリで操作する方法
ポイントはこんな感じ

詳細


 

プログラムピックアップ

using Microsoft.Online.SharePoint.TenantAdministration;
using Microsoft.Online.SharePoint.TenantManagement;

 

//Open Tenant
Tenant tenant = new Tenant(adminContext);
SPOSitePropertiesEnumerable siteProp = tenant.GetSiteProperties(0, true);
adminContext.Load(siteProp);
adminContext.ExecuteQuery();

//– Site Collection
foreach (SiteProperties sp in siteProp)
{

Uri spUri = new Uri(sp.Url);

}