狠狠撸

狠狠撸Share a Scribd company logo
Xamarin.Forms で Azure AD 認証付きの
WebAPI のベストプラクティスを考える
2019/12/9 JXUGC #26 平?エディション
Satoru Fujimori / @masatoru
2019/12/9 JXUGC #26 平?エディション
About Me
藤森 智 @masatoru
株式会社ケイ?ジェイ?システムズ代表
Azure / Xamarin / C# の開発、ほぼ .Net な毎?
おでんはじめました(Blog): http://masatoru.hatenadiary.jp/
最近ヨガ と React Native にハマり中
2019/12/9 JXUGC #26 平?エディション
実現したいこと
2019/12/9 JXUGC #26 平?エディション
検討する項?
Xamarin.Forms の認証で使?するライブラリ
App Center Auth
MSAL.NET or ADAL.NET
App Service へ認証を実装する
Easy Auth( App Service → 認証/承認 )
バックエンド( ASP.NET Core ) に認証を実装する
できるだけコードを書かずに実装したい
2019/12/9 JXUGC #26 平?エディション
Mobile Apps SDK(というのが昔あった)
機能
オフライン同期
Azure AD 認証(+ App Service Easy Auth)
プッシュ通知
SDK
Xamarin.Forms
.NET バックエンド
→ 「これからは App Center を使?してください」(という通達)
2019/12/9 JXUGC #26 平?エディション
Case1: App Center Auth
2019/12/9 JXUGC #26 平?エディション
App Center Auth のメリット / デメリット
Azure AD B2C のみ対応
Azure AD 対応予定(ロードマップ)
Easy Auth の詳細モードを使?すると Azure AD と B2C を接続可能
Xamarin 側の認証の実装はとても簡単(たった1?!!)
var userInfo = await Auth.SignInAsync();
var accessToken = userInfo.AccessToken;
トークンをリフレッシュする仕組みがない?
→ 認証の遷移画?のハンドリングがよくわからず断念
→ Xamarin 側のライブラリは MSAL.NET の?択に絞られる
2019/12/9 JXUGC #26 平?エディション
MSAL で認証の画?遷移を実装する
キャッシュがあれば使?する、なければ画?遷移するという書き?
public static async Task<string> TryLogin()
{
AuthenticationResult authResult = null;
IEnumerable<IAccount> accounts = await App.PCA.GetAccountsAsync();
try{
IAccount firstAccount = accounts.FirstOrDefault();
// キャッシュがあれば使?する、賞味期限も?動的に更新される
authResult = await App.PCA.AcquireTokenSilent("User.Read", firstAccount)
.ExecuteAsync();
}catch (MsalUiRequiredException ex){
try{
// キャッシュがなければ認証画?を表?する
authResult = await App.PCA.AcquireTokenInteractive(App.Scopes)
.WithParentActivityOrWindow(App.ParentWindow)
.ExecuteAsync();
}catch (Exception ex2){}
}
return authResult?.AccessToken ?? "";
}
2019/12/9 JXUGC #26 平?エディション
取得したアクセストークンを使って検証する
jwt.ms などでトークンの中?を調べる
エンドポイントやスコープを確認する
POSTMAN などで WebAPI を叩いてみる
他にも .auth/me でアクセストークンや ID トークンを取得することが
できる
2019/12/9 JXUGC #26 平?エディション
アクセストークンと ID トークン
WebAPI をたたくのに使?するのはどっち?
アクセストークン: Web APIを認証/認可サーバで保護して他のアプ
リケーションに公開する場合
IDトークン: Web APIを?分のアプリケーションの?部(バックエン
ドサービス)として作成して保護する場合
参考) OAuth 2.0/OpenID Connectの2つのトークンの使いみち
2019/12/9 JXUGC #26 平?エディション
Case2: MSAL と Easy Auth(App Service)
2019/12/9 JXUGC #26 平?エディション
Easy Auth は MSAL に対応していない(と公式
に書いてある)
Easy Auth とは
App Service の設定で Azure AD の認証を組み込むことができる
バックエンドに実装が不要?
MSAL(Azure AD V2 エンドポイント)には対応していない
現時点では、Azure App Service と Azure Functions は Azure AD v1.0
でのみサポートされています。 Microsoft Authentication Libraries
(MSAL) が含まれる Microsoft ID プラットフォーム v2.0 ではサポート
されていません。
2019/12/9 JXUGC #26 平?エディション
Azure AD のエンドポイント
Azure AD 開発者プラットフォーム( V1 エンドポイント)
職場または学校のアカウント
Azure AD 認証ライブラリ (ADAL)
Easy Auth は V1 エンドポイントのみ対応
Microsoft ID プラットフォーム v2.0(Azure AD V2 エンドポイント)
職場または学校のアカウント+個?アカウントやソーシャルアカ
ウント(B2C)
Microsoft Authentication Library (MSAL)
2019/12/9 JXUGC #26 平?エディション
Case3: MSAL と Microsoft.Identity.Web フォ
ルダを使?しての実装
2019/12/9 JXUGC #26 平?エディション
Microsoft.Identity.Web とは
GitHub 上にある(公式の?)サンプル
Azure-Samples/active-directory-dotnet-native-aspnetcore-v2
Microsoft.Identity.Web フォルダ( 30 ファイル以上)をコピーして
バックエンド( ASP.NET Core )に実装する
public void ConfigureServices(IServiceCollection services)
{
services.AddProtectedWebApi(Configuration);
...
→ (このサンプル以外)MSAL と Azure AD V2 の公式の?法はない
2019/12/9 JXUGC #26 平?エディション
これがオレの(2週間の苦悩で得た)
ベストプラクティスだ?(微妙...)
2019/12/9 JXUGC #26 平?エディション
という話を
しばやん(@shibayan)にしたところ、
2019/12/9 JXUGC #26 平?エディション
「ちょっと Chris に聞いてみる」
2019/12/9 JXUGC #26 平?エディション
Case4: EasyAuth は Azure AD V2 エンドポイン
トに対応している(ぽい
2019/12/9 JXUGC #26 平?エディション
MSAL と EasyAuth の組み合わせのポイントと
注意点
EasyAuth の「発?者 URL 」で以下を設定(公式ドキュメントに掲載無
し)
https://login.microsoftonline.com/{テナントID}/v2.0/.well-
known/openid-configuration
現状は、アクセストークンは V1 エンドポイント、ID トークンは V2 エ
ンドポイントなので注意(バグか仕様かは不明)
※Azure AD にスコープを追加することで V2 エンドポイントを追加す
ることができる
2019/12/9 JXUGC #26 平?エディション
まとめ
公式ドキュメントを時には疑う(無理
すごい?に相談すると公式以上の回答が返ってきて唖然とすることが
ある 持つべきものは?脈
Azure AD はエンドポイントに気を付ける必要がある
App Center Auth も EasyAuth も過渡期なので今後の動向に注?
認証( 401 Unauthorized )は怖くない
2019/12/9 JXUGC #26 平?エディション
ご清聴ありがとうございました
2019/12/9 JXUGC #26 平?エディション

More Related Content

Thinking the best practice of WebAPI with Azure AD For Xamarin.Forms