CSOM が .NET Standard に対応したらしいので試してみた
CSOM が .NET Standard に対応したとのことです。
使用方法は次のドキュメントで解説されているので、それに沿って進めていきます。
docs.microsoft.comIt's finally here! .NET Standard 2.0 version of the #SharePoint Online CSOM NuGet package to unblock taking advantage of latest Azure capabilities with your SharePoint Online solutions. See more from https://t.co/eLB7ExlDBY #Microsoft365dev #MSDev pic.twitter.com/JlMkpujhrv
— Microsoft SharePoint (@SharePoint) 2020年6月23日
環境情報
- Windows 10 Version 2004
- Visual Studio 2019 Version 16.6.2
- Microsoft.SharePointOnline.CSOM Version 16.1.20211.12000
Microsoft.SharePointOnline.CSOM をインストール
コンソール アプリケーション(.NET Core)プロジェクトを作成します。
NuGet で Microsoft.SharePointOnline.CSOM Version 16.1.20211.12000 をインストールします。
ソースコードは弄らずにそのままビルドしたところ、警告はありませんでした。
ちなみに、ひとつ前のバージョン(16.1.20211.12000)だと次のような警告が出てました。 最新バージョンではちゃんと .NET Standard に対応してるみたいですね。
認証処理について
今までのようにユーザーIDとパスワードを用いた基本認証は、CSOM .NET Standard 版ではもうできないようです。代わりに、OAuth アクセストークンを用いた認証方式を使用します。
SharePoint Online のアクセストークンを取得するための推奨アプローチは、Azure AD アプリケーションを登録し、SharePoint のアクセス許可を与えること、とのこと。
というわけで、Azure AD アプリケーションの登録方法は次の通りです。
Azure AD アプリケーションの登録
Azure Active Directory > アプリの登録 からアプリケーションを登録します。
作成したアプリケーションのアプリケーションIDは控えておきましょう。
API のアクセス許可から SharePoint を選択します。
委任されたアクセス許可 を選択します。
今回は、AllSites.Manage を選択します。
管理者の同意を与えます をクリックします。
サイドナビゲーションから「認証」をクリックします。
「既定のクライアントの種類」の選択肢を「はい」に変更します。
ソースコード
サンプルコードは Program.cs と AuthenticationManager.cs の 2 ファイルがあります。 Program.cs は一部記載が省略されている部分があったので補足しています。
using System; using System.Security; using System.Threading.Tasks; namespace ConsoleApp2 { class Program { static async Task Main(string[] args) { var site = new Uri("https://contoso.sharepoint.com/sites/hoge"); var user = "shibatea@consoto.onmicrosoft.com"; var password = GetSecureString($"Password for {user} : "); // Note: The PnP Sites Core AuthenticationManager class also supports this using var authenticationManager = new AuthenticationManager(); using var context = authenticationManager.GetContext(site, user, password); context.Load(context.Web, p => p.Title); await context.ExecuteQueryAsync(); Console.WriteLine($"Title: {context.Web.Title}"); } static SecureString GetSecureString(string message) { SecureString sStrPwd = new SecureString(); try { Console.Write(message); for (ConsoleKeyInfo keyInfo = Console.ReadKey(true); keyInfo.Key != ConsoleKey.Enter; keyInfo = Console.ReadKey(true)) { if (keyInfo.Key == ConsoleKey.Backspace) { if (sStrPwd.Length > 0) { sStrPwd.RemoveAt(sStrPwd.Length - 1); Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop); Console.Write(" "); Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop); } } else if (keyInfo.Key != ConsoleKey.Enter) { Console.Write("*"); sStrPwd.AppendChar(keyInfo.KeyChar); } } Console.WriteLine(""); } catch (Exception e) { sStrPwd = null; Console.WriteLine(e.Message); } return sStrPwd; } } }
AuthenticationManager.cs は、サンプルコードのままコピペすると画像の通り FormDigestHandlingEnabled
プロパティが見つからなくてコンパイルエラーになります。
Microsoft.SharePointOnline.CSOM の一つ前のバージョンとソースコードを逆コンパイルして比較したら、FormDigestHandlingEnabled
プロパティは削除されていました。
( FormDigestHandlingEnabled = false
相当と同じ動きになるように修正されている )
コンパイルエラーが発生している行をコメントアウトすれば動作確認ができました。
( おまけ ) SharePointPnPCoreOnline を試しにインストール
すると、大量に警告が表示されました。SharePointPnPCoreOnline が依存してるライブラリの中に、.NET Framework しか対応してないものが含まれてるようです。
最後に
ひとまず .NET Standard で CSOM が動くことがわかりました。これで SharePoint CSOM を使うために Azure Functions V1 を使っていたものが V3 に移行できそうですね。(PnP を使ってるとダメですが…)
それと以前から疑問に思っていたのが…、Microsoft.SharePointOnline.CSOM のソースコードは公開されていないんでしたっけ?
探し方が下手なのか見つからないので、私は逆コンパイルして中身を確認しています。