3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[SharePoint]CSOMでログインにパスワード以外を使う

Posted at

経緯

もうすぐ全ての.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アプリケーションを構成したい

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?