Tech Note

Azure, Office 365, Power Platform, etc... の勉強手記

CSOM が .NET Standard に対応したらしいので試してみた

CSOM が .NET Standard に対応したとのことです。
使用方法は次のドキュメントで解説されているので、それに沿って進めていきます。

docs.microsoft.com

環境情報

Microsoft.SharePointOnline.CSOM をインストール

コンソール アプリケーション(.NET Core)プロジェクトを作成します。
NuGet で Microsoft.SharePointOnline.CSOM Version 16.1.20211.12000 をインストールします。

f:id:shibatea:20200624015649p:plain

ソースコードは弄らずにそのままビルドしたところ、警告はありませんでした。

f:id:shibatea:20200624020205p:plain

ちなみに、ひとつ前のバージョン(16.1.20211.12000)だと次のような警告が出てました。 最新バージョンではちゃんと .NET Standard に対応してるみたいですね。

f:id:shibatea:20200624020058p:plain

認証処理について

今までのようにユーザーIDとパスワードを用いた基本認証は、CSOM .NET Standard 版ではもうできないようです。代わりに、OAuth アクセストークンを用いた認証方式を使用します。
SharePoint Online のアクセストークンを取得するための推奨アプローチは、Azure AD アプリケーションを登録し、SharePoint のアクセス許可を与えること、とのこと。

というわけで、Azure AD アプリケーションの登録方法は次の通りです。

Azure AD アプリケーションの登録

Azure Active Directory > アプリの登録 からアプリケーションを登録します。
作成したアプリケーションのアプリケーションIDは控えておきましょう。

f:id:shibatea:20200624025523p:plain

API のアクセス許可から SharePoint を選択します。

f:id:shibatea:20200624025723p:plain

委任されたアクセス許可 を選択します。

f:id:shibatea:20200624030005p:plain

今回は、AllSites.Manage を選択します。

f:id:shibatea:20200624030104p:plain

管理者の同意を与えます をクリックします。

f:id:shibatea:20200624030205p:plain

サイドナビゲーションから「認証」をクリックします。

f:id:shibatea:20200624030444p:plain

「既定のクライアントの種類」の選択肢を「はい」に変更します。

f:id:shibatea:20200624030616p:plain

ソースコード

サンプルコードは 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 プロパティが見つからなくてコンパイルエラーになります。

f:id:shibatea:20200624043152p:plain

Microsoft.SharePointOnline.CSOM の一つ前のバージョンとソースコードを逆コンパイルして比較したら、FormDigestHandlingEnabled プロパティは削除されていました。
( FormDigestHandlingEnabled = false 相当と同じ動きになるように修正されている )

コンパイルエラーが発生している行をコメントアウトすれば動作確認ができました。

f:id:shibatea:20200624042307p:plain
左が最新バージョン、右が一つ前のバージョン

( おまけ ) SharePointPnPCoreOnline を試しにインストール

すると、大量に警告が表示されました。SharePointPnPCoreOnline が依存してるライブラリの中に、.NET Framework しか対応してないものが含まれてるようです。

f:id:shibatea:20200624023506p:plain

最後に

ひとまず .NET Standard で CSOM が動くことがわかりました。これで SharePoint CSOM を使うために Azure Functions V1 を使っていたものが V3 に移行できそうですね。(PnP を使ってるとダメですが…)

それと以前から疑問に思っていたのが…、Microsoft.SharePointOnline.CSOM のソースコードは公開されていないんでしたっけ?
探し方が下手なのか見つからないので、私は逆コンパイルして中身を確認しています。