経緯
もうすぐ全ての.NETが.NET5(旧Core)に集約されることになりますが、この.NET5にはCSOMのパスワード認証で標準的に使われているSharePointOnlineCredentials
が使えなくなるそうです。
それ以前に、パスワードレス認証でログインしている人が困ってしまうのでそれに対応したいというのが動機です。
.NET5以前
.NET5以前の場合は、NuGetで「SharePointPnPCoreOnline」を入れたあと、
var authenticationManager = new OfficeDevPnP.Core.AuthenticationManager();
ClientContext context = authenticationManager.GetWebLoginClientContext("<Site URL>", null);
で出来る様です。(.NET5以前では試してはいません)
2020/10/4現在では.NET5環境ではうまく動作しませんでした。
ビルド時に.NET5に対応していない旨の警告が出るのが関係していると思います。
今回行なった方法
PnP Coreの認証ライブラリを使用した後、アクセストークンを取り出してCSOMのClientContext
を初期化します。
ただ、そもそもPnPにはCSOMと同様なSharePointアクセスだけでなくMicrosoftGraphも扱えるので、CSOMで実装済みの資源をなるべく修正したくない場合を除けば、CSOMをあえて使う必要は無いです。
サンプル
サンプルは以下に置いておきます。
https://github.com/RYO-4947123/CSOM_Sample
※あらかじめAADにアプリ登録をしておく必要があります。
https://github.com/pnp/pnpcore/tree/dev/src/samples/Demo.Console
要点
PnP.Core.Authのヘルパーを駆使してログインを行なった後、アクセストークンを取り出します。
var accessToken = await context.AuthenticationProvider.GetAccessTokenAsync(context.Uri);
その後、CSOMのClientContext
作成時にリクエストヘッダにトークンを加える様に初期化します。
context.ExecutingWebRequest += (sender, e) =>
{
// Insert the access token in the request
e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + accessToken;
};
あとは今まで通りClientContext
を使ってSharePointにアクセスすることができます。
※注意点
コンソールアプリの場合、一度接続を切る(Host.Dispose()
)と再接続してもGetAccessTokenAsync
メソッドがデッドロックして帰ってこなくなります。
参考にしたサイト
.NET Standard に対応した CSOM で注意するべき点について
.NET Framework で CSOM ではなく、.NET Standard に対して CSOM を使用する
PnP Core SDK
独自のAzureADアプリケーションを構成したい