クライアント シークレットまたはクライアント証明書
ご利用の Web アプリでダウンストリーム Web API を呼び出すことができるようになったため、クライアント シークレットまたはクライアント証明書を appsettings.json ファイルに指定してください。 次を指定するセクションを追加することもできます。
- ダウンストリーム Web API の URL
- API の呼び出しに必要なスコープ
次の例では、GraphBeta
セクションでこれらの設定を指定しています。
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "[Enter_the_Application_Id_Here]",
"TenantId": "common",
// To call an API
"ClientCredentials": [
{
"SourceType": "ClientSecret",
"ClientSecret":"[Enter_the_Client_Secret_Here]"
}
]
},
"GraphBeta": {
"BaseUrl": "https://graph.microsoft.com/beta",
"Scopes": ["user.read"]
}
}
Note
Azure Kubernetes のワークロード ID フェデレーションのような資格情報のないソリューションなど、クライアント資格情報のコレクションを提案できます。
以前のバージョンの Microsoft.Identity.Web では、"ClientCredentials" ではなく単一のプロパティ "ClientSecret" でクライアント シークレットが表現されていました。 これは下位互換性のために引き続きサポートされていますが、"ClientSecret" プロパティと "ClientCredentials" コレクションの両方を使用することはできません。
クライアント シークレットの代わりに、クライアント証明書を指定することができます。 次のコード スニペットは、Azure Key Vault に格納されている証明書の使用を示しています。
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "[Enter_the_Application_Id_Here]",
"TenantId": "common",
// To call an API
"ClientCredentials": [
{
"SourceType": "KeyVault",
"KeyVaultUrl": "https://msidentitywebsamples.vault.azure.net",
"KeyVaultCertificateName": "MicrosoftIdentitySamplesCert"
}
]
},
"GraphBeta": {
"BaseUrl": "https://graph.microsoft.com/beta",
"Scopes": ["user.read"]
}
}
警告
Scopes
を配列に変更することを忘れた場合、IDownstreamApi
を使用しようとするとスコープに null が表示され、IDownstreamApi
はダウンストリーム API に対して匿名 (非認証) の呼び出しを試み、その結果、401/unauthenticated
が発生します。
Microsoft.Identity.Web では、構成またはコードの両方で証明書を記述するいくつかの方法を提供しています。 詳細については、GitHub 上の「Microsoft.Identity.Web - 証明書の使用」を参照してください。
Startup.cs ファイルを変更する
Web アプリでは、ダウンストリーム API のトークンを取得する必要があります。 これを指定するには、.AddMicrosoftIdentityWebApp(Configuration)
の後に .EnableTokenAcquisitionToCallDownstreamApi()
行を追加します。 この行により、コントローラーおよびページのアクションで使用できる IAuthorizationHeaderProvider
サービスが公開されます。 ただし、次の 2 つのオプションでわかるように、これはもっと簡単に行うことができます。 "Startup.cs" で、.AddInMemoryTokenCaches()
などのトークン キャッシュの実装を選択する必要もあります。
using Microsoft.Identity.Web;
public class Startup
{
// ...
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
.AddInMemoryTokenCaches();
// ...
}
// ...
}
EnableTokenAcquisitionToCallDownstreamApi
に渡されるスコープは省略可能であり、Web アプリでサインイン時にスコープとそれらのスコープに対するユーザーの同意を要求できます。 スコープを指定しない場合は、Microsoft.Identity.Web によって、増分同意エクスペリエンスが有効になります。
"Microsoft.Identity.Web" には、トークンを取得しなくても Web アプリから Web API を呼び出すための 2 つのメカニズムが用意されています。 選択するオプションは、Microsoft Graph または別の API のどちらを呼び出すかによって異なります。
オプション 1: Microsoft Graph の呼び出し
Microsoft Graph を呼び出す場合は、Microsoft.Identity.Web を使用すると、API アクションで GraphServiceClient
(Microsoft Graph SDK によって公開されている) を直接使用することができます。 Microsoft Graph を公開するには、次の手順を実行します。
Microsoft.Identity.Web.GraphServiceClient NuGet パッケージをプロジェクトに追加します。
Startup.cs ファイルで .EnableTokenAcquisitionToCallDownstreamApi()
の後に .AddMicrosoftGraph()
を追加します。 .AddMicrosoftGraph()
にはいくつかのオーバーライドがあります。 構成セクションをパラメーターとして受け取るオーバーライドを使用すると、コードは次のようになります。
using Microsoft.Identity.Web;
public class Startup
{
// ...
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
.AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
.AddInMemoryTokenCaches();
// ...
}
// ...
}
オプション 2:Microsoft Graph 以外のダウンストリーム Web API を呼び出す
Microsoft Graph ではなく API を呼び出す場合は、Microsoft.Identity.Web を使用すると、API アクションで IDownstreamApi
インターフェイスを使用できます。 このインターフェイスを使用するには、以下を行います。
Microsoft.Identity.Web.DownstreamApi NuGet パッケージをプロジェクトに追加します。
Startup.cs ファイルで .EnableTokenAcquisitionToCallDownstreamApi()
の後に .AddDownstreamApi()
を追加します。 .AddDownstreamApi()
には、次のスニペットに示すように 2 つの引数があります。
- 対応する構成を参照するためにコントローラー アクションで使用されるサービスの名前 (API)
- ダウンストリーム Web API の呼び出しに使用されるパラメーターを表す構成セクション。
using Microsoft.Identity.Web;
public class Startup
{
// ...
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
.AddDownstreamApi("MyApi", Configuration.GetSection("GraphBeta"))
.AddInMemoryTokenCaches();
// ...
}
// ...
}
まとめ
Web API と同様に、さまざまなトークン キャッシュの実装を選択できます。 詳細については、GitHub の Microsoft.Identity.Web - トークン キャッシュのシリアル化のページを参照してください。
次の図は、Microsoft.Identity.Web のさまざまな可能性と、Startup.cs ファイルへの影響を示しています。
クライアント シークレットまたはクライアント証明書
ご利用の Web アプリでダウンストリーム Web API を呼び出すことができるようになったため、クライアント シークレットまたはクライアント証明書を appsettings.json ファイルに指定してください。 次を指定するセクションを追加することもできます。
- ダウンストリーム Web API の URL
- API の呼び出しに必要なスコープ
次の例では、GraphBeta
セクションでこれらの設定を指定しています。
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "[Enter_the_Application_Id_Here]",
"TenantId": "common",
// To call an API
"ClientCredentials": [
{
"SourceType": "ClientSecret",
"ClientSecret":"[Enter_the_Client_Secret_Here]"
}
]
},
"GraphBeta": {
"BaseUrl": "https://graph.microsoft.com/beta",
"Scopes": ["user.read"]
}
}
Note
Azure Kubernetes のワークロード ID フェデレーションのような資格情報のないソリューションなど、クライアント資格情報のコレクションを提案できます。
以前のバージョンの Microsoft.Identity.Web では、"ClientCredentials" ではなく単一のプロパティ "ClientSecret" でクライアント シークレットが表現されていました。 これは下位互換性のために引き続きサポートされていますが、"ClientSecret" プロパティと "ClientCredentials" コレクションの両方を使用することはできません。
クライアント シークレットの代わりに、クライアント証明書を指定することができます。 次のコード スニペットは、Azure Key Vault に格納されている証明書の使用を示しています。
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "[Enter_the_Application_Id_Here]",
"TenantId": "common",
// To call an API
"ClientCredentials": [
{
"SourceType": "KeyVault",
"KeyVaultUrl": "https://msidentitywebsamples.vault.azure.net",
"KeyVaultCertificateName": "MicrosoftIdentitySamplesCert"
}
]
},
"GraphBeta": {
"BaseUrl": "https://graph.microsoft.com/beta",
"Scopes": ["user.read"]
}
}
警告
Scopes
を配列に変更することを忘れた場合、IDownstreamApi
を使用しようとするとスコープに null が表示され、IDownstreamApi
はダウンストリーム API に対して匿名 (非認証) の呼び出しを試み、その結果、401/unauthenticated
が発生します。
Microsoft.Identity.Web では、構成またはコードの両方で証明書を記述するいくつかの方法を提供しています。 詳細については、GitHub 上の「Microsoft.Identity.Web - 証明書の使用」を参照してください。
Startup.Auth.cs
Web アプリでダウンストリーム API のトークンを取得する必要があります。"Microsoft.Identity.Web" には、Web アプリから Web API を呼び出すための 2 つのメカニズムが用意されています。 選択するオプションは、Microsoft Graph または別の API のどちらを呼び出すかによって異なります。
オプション 1: Microsoft Graph の呼び出し
Microsoft Graph を呼び出す場合は、Microsoft.Identity.Web を使用すると、API アクションで GraphServiceClient
(Microsoft Graph SDK によって公開されている) を直接使用することができます。 Microsoft Graph を公開するには、次の手順を実行します。
- Microsoft.Identity.Web.GraphServiceClient NuGet パッケージをプロジェクトに追加します。
.AddMicrosoftGraph()
を Startup.Auth.cs ファイル内のサービス コレクションに追加します。 .AddMicrosoftGraph()
にはいくつかのオーバーライドがあります。 構成セクションをパラメーターとして受け取るオーバーライドを使用すると、コードは次のようになります。
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Client;
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.OWIN;
using Microsoft.Identity.Web.TokenCacheProviders.InMemory;
using Microsoft.IdentityModel.Validators;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Owin;
namespace WebApp
{
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
// Get an TokenAcquirerFactory specialized for OWIN
OwinTokenAcquirerFactory owinTokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance<OwinTokenAcquirerFactory>();
// Configure the web app.
app.AddMicrosoftIdentityWebApp(owinTokenAcquirerFactory,
updateOptions: options => {});
// Add the services you need.
owinTokenAcquirerFactory.Services
.Configure<ConfidentialClientApplicationOptions>(options =>
{ options.RedirectUri = "https://localhost:44326/"; })
.AddMicrosoftGraph()
.AddInMemoryTokenCaches();
owinTokenAcquirerFactory.Build();
}
}
}
オプション 2:Microsoft Graph 以外のダウンストリーム Web API を呼び出す
Microsoft Graph ではなく API を呼び出す場合は、Microsoft.Identity.Web を使用すると、API アクションで IDownstreamApi
インターフェイスを使用できます。 このインターフェイスを使用するには、以下を行います。
- Microsoft.Identity.Web.DownstreamApi NuGet パッケージをプロジェクトに追加します。
- Startup.cs ファイルで
.EnableTokenAcquisitionToCallDownstreamApi()
の後に .AddDownstreamApi()
を追加します。 .AddDownstreamApi()
には次の 2 つの引数があります。
- サービスの名前 (API): コントローラー アクションでこの名前を使用して、対応する構成を参照します
- ダウンストリーム Web API の呼び出しに使用されるパラメーターを表す構成セクション。
コードは次のとおりです。
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Client;
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.OWIN;
using Microsoft.Identity.Web.TokenCacheProviders.InMemory;
using Microsoft.IdentityModel.Validators;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Owin;
namespace WebApp
{
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
// Get a TokenAcquirerFactory specialized for OWIN.
OwinTokenAcquirerFactory owinTokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance<OwinTokenAcquirerFactory>();
// Configure the web app.
app.AddMicrosoftIdentityWebApp(owinTokenAcquirerFactory,
updateOptions: options => {});
// Add the services you need.
owinTokenAcquirerFactory.Services
.Configure<ConfidentialClientApplicationOptions>(options =>
{ options.RedirectUri = "https://localhost:44326/"; })
.AddDownstreamApi("Graph", owinTokenAcquirerFactory.Configuration.GetSection("GraphBeta"))
.AddInMemoryTokenCaches();
owinTokenAcquirerFactory.Build();
}
}
}
まとめ
さまざまなトークン キャッシュの実装を選択できます。 詳細については、GitHub の Microsoft.Identity.Web - トークン キャッシュのシリアル化のページを参照してください。
次の図は、Microsoft.Identity.Web のさまざまな可能性と、Startup.cs ファイルへの影響を示しています。
この記事および以下のコードの例は、ASP.NET Web アプリ サンプルから抜粋されたものです。 完全な実装の詳細については、そのサンプルをご覧ください。
Java コード サンプルを実装する
この記事および以下のコードの例は、Microsoft Graph を呼び出す Java Web アプリケーション (MSAL for Java を使用する Web アプリ サンプル) から抜粋されています。
そのサンプルでは、現在、MSAL for Java を使用して、承認コードの URL を生成し、Microsoft ID プラットフォームに対する承認エンドポイントへのナビゲーションを処理しています。 また、Sprint セキュリティを使用してユーザーをサインインさせることもできます。 完全な実装の詳細については、そのサンプルをご覧ください。
Node.js コード サンプルを実装する
この記事と次のコード例は、Node.js Microsoft Graph を呼び出す Express.js Web アプリケーション (MSAL Node を使用する Web アプリ サンプル) から抜粋されています。
そのサンプルでは、現在、MSAL ノードを使用して、承認コードの URL を生成し、Microsoft ID プラットフォームに対する承認エンドポイントへのナビゲーションを処理しています。 これを次に示します。
/**
* Prepares the auth code request parameters and initiates the first leg of auth code flow
* @param req: Express request object
* @param res: Express response object
* @param next: Express next function
* @param authCodeUrlRequestParams: parameters for requesting an auth code url
* @param authCodeRequestParams: parameters for requesting tokens using auth code
*/
redirectToAuthCodeUrl(authCodeUrlRequestParams, authCodeRequestParams, msalInstance) {
return async (req, res, next) => {
// Generate PKCE Codes before starting the authorization flow
const { verifier, challenge } = await this.cryptoProvider.generatePkceCodes();
// Set generated PKCE codes and method as session vars
req.session.pkceCodes = {
challengeMethod: 'S256',
verifier: verifier,
challenge: challenge,
};
/**
* By manipulating the request objects below before each request, we can obtain
* auth artifacts with desired claims. For more information, visit:
* https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_node.html#authorizationurlrequest
* https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_node.html#authorizationcoderequest
**/
req.session.authCodeUrlRequest = {
...authCodeUrlRequestParams,
responseMode: msal.ResponseMode.FORM_POST, // recommended for confidential clients
codeChallenge: req.session.pkceCodes.challenge,
codeChallengeMethod: req.session.pkceCodes.challengeMethod,
};
req.session.authCodeRequest = {
...authCodeRequestParams,
code: '',
};
try {
const authCodeUrlResponse = await msalInstance.getAuthCodeUrl(req.session.authCodeUrlRequest);
res.redirect(authCodeUrlResponse);
} catch (error) {
next(error);
}
};
}
Python コード サンプルを実装する
この記事内および以下のコード スニペットは、ID パッケージ (MSAL Python 用ラッパー) を使用して Microsoft Graph を呼び出す Python Web アプリケーション サンプルから抜粋されています。
そのサンプルでは、identity パッケージを使用して承認コードの URL を生成し、Microsoft ID プラットフォームの承認エンドポイントへのナビゲーションを処理しています。 完全な実装の詳細については、そのサンプルをご覧ください。
Microsoft.Identity.Web では、正しい OpenID Connect 設定を設定し、コードの受信イベントをサブスクライブして、コードを引き換えることで、コードを簡単にすることができます。 認可コードを引き換えるために、特別なコードは必要ありません。 この仕組みの詳細については、Microsoft.Identity.Web のソース コードをご覧ください。
"Microsoft.Identity.Web.OWIN" では、正しい OpenID Connect を設定し、コードの受信イベントをサブスクライブして、コードを引き換えることで、コードを簡素化できます。 認可コードを引き換えるために、特別なコードは必要ありません。 この仕組みの詳細については、Microsoft.Identity.Web のソース コードをご覧ください。
AuthProvider クラスの handleRedirect メソッドは、Microsoft Entra ID から受信した認証コードを処理します。 これを次に示します。
handleRedirect(options = {}) {
return async (req, res, next) => {
if (!req.body || !req.body.state) {
return next(new Error('Error: response not found'));
}
const authCodeRequest = {
...req.session.authCodeRequest,
code: req.body.code,
codeVerifier: req.session.pkceCodes.verifier,
};
try {
const msalInstance = this.getMsalInstance(this.msalConfig);
if (req.session.tokenCache) {
msalInstance.getTokenCache().deserialize(req.session.tokenCache);
}
const tokenResponse = await msalInstance.acquireTokenByCode(authCodeRequest, req.body);
req.session.tokenCache = msalInstance.getTokenCache().serialize();
req.session.idToken = tokenResponse.idToken;
req.session.account = tokenResponse.account;
req.session.isAuthenticated = true;
const state = JSON.parse(this.cryptoProvider.base64Decode(req.body.state));
res.redirect(state.successRedirect);
} catch (error) {
next(error);
}
}
}
「ユーザーをサインインさせる Web アプリ: コード構成」を参照して、Java サンプルで承認コードを取得する方法を理解してください。 アプリがコードを受け取った後、AuthFilter.java#L51-L56 では次のことが行われます。
- AuthHelper.java#L67-L97 の
AuthHelper.processAuthenticationCodeRedirect
メソッドに委任します。
getAuthResultByAuthCode
を呼び出します。
class AuthHelper {
// Code omitted
void processAuthenticationCodeRedirect(HttpServletRequest httpRequest, String currentUri, String fullUrl)
throws Throwable {
// Code omitted
AuthenticationResponse authResponse = AuthenticationResponseParser.parse(new URI(fullUrl), params);
// Code omitted
IAuthenticationResult result = getAuthResultByAuthCode(
httpRequest,
oidcResponse.getAuthorizationCode(),
currentUri);
// Code omitted
}
}
getAuthResultByAuthCode
メソッドは AuthHelper.java#L176 で定義されています。 MSAL の ConfidentialClientApplication
を作成した後、承認コードから作成された AuthorizationCodeParameters
を使用して acquireToken()
を呼び出します。
private IAuthenticationResult getAuthResultByAuthCode(
HttpServletRequest httpServletRequest,
AuthorizationCode authorizationCode,
String currentUri) throws Throwable {
IAuthenticationResult result;
ConfidentialClientApplication app;
try {
app = createClientApplication();
String authCode = authorizationCode.getValue();
AuthorizationCodeParameters parameters = AuthorizationCodeParameters.builder(
authCode,
new URI(currentUri)).
build();
Future<IAuthenticationResult> future = app.acquireToken(parameters);
result = future.get();
} catch (ExecutionException e) {
throw e.getCause();
}
if (result == null) {
throw new ServiceUnavailableException("authentication result was null");
}
SessionManagementHelper.storeTokenCacheInSession(httpServletRequest, app.tokenCache().serialize());
return result;
}
private ConfidentialClientApplication createClientApplication() throws MalformedURLException {
return ConfidentialClientApplication.builder(clientId, ClientCredentialFactory.create(clientSecret)).
authority(authority).
build();
}
Python サンプルで承認コードを取得する方法については、「ユーザーをサインインさせる Web アプリ - コード構成」を参照してください。
Microsoft サインイン画面は、アプリ登録で指定された /getAToken
URL に承認コードを送信します。 auth_response
ルートは、auth.complete_login
を呼び出して承認コードを処理し、エラーを返すか、ホーム ページにリダイレクトして、その URL を処理します。
@app.route(app_config.REDIRECT_PATH)
def auth_response():
result = auth.complete_log_in(request.args)
if "error" in result:
return render_template("auth_error.html", result=result)
return redirect(url_for("index"))
そのコードの完全なコンテキストについては、app.py に関するページを参照してください。
機密クライアント アプリケーションでは、クライアント シークレットではなく、クライアント証明書またはクライアント アサーションを使用してその ID を証明することもできます。
クライアント アサーションの使用は高度なシナリオであり、詳細についてはクライアント アサーションに関するページをご覧ください。
ASP.NET Core のチュートリアルでは、依存関係の挿入を使用して、アプリケーションの Startup.cs ファイルでトークン キャッシュの実装を決定できます。 Microsoft.Identity.Web には、「トークン キャッシュのシリアル化」で説明されている構築済みのトークン キャッシュ シリアライザーが付属しています。 興味深い可能性として、ASP.NET Core の分散メモリ キャッシュを選択できます。
// Use a distributed token cache by adding:
services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi(
initialScopes: new string[] { "user.read" })
.AddDistributedTokenCaches();
// Then, choose your implementation.
// For instance, the distributed in-memory cache (not cleared when you stop the app):
services.AddDistributedMemoryCache();
// Or a Redis cache:
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost";
options.InstanceName = "SampleInstance";
});
// Or even a SQL Server token cache:
services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString = _config["DistCache_ConnectionString"];
options.SchemaName = "dbo";
options.TableName = "TestCache";
});
トークン キャッシュ プロバイダーの詳細については、Microsoft.Identity.Web のトークン キャッシュのシリアル化に関する記事、および Web アプリのチュートリアルの ASP.NET Core Web アプリのチュートリアル | トークン キャッシュのフェーズもご覧ください。
ASP.NET のチュートリアルでは、依存関係の挿入を使用して、アプリケーションの "Startup.Auth.cs" ファイルでトークン キャッシュの実装を決定できます。 "Microsoft.Identity.Web" には、トークン キャッシュのシリアル化に関するページで説明されている構築済みのトークン キャッシュ シリアライザーが付属しています。 興味深い可能性として、ASP.NET Core の分散メモリ キャッシュを選択できます。
var services = owinTokenAcquirerFactory.Services;
// Use a distributed token cache by adding:
services.AddDistributedTokenCaches();
// Then, choose your implementation.
// For instance, the distributed in-memory cache (not cleared when you stop the app):
services.AddDistributedMemoryCache();
// Or a Redis cache:
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost";
options.InstanceName = "SampleInstance";
});
// Or even a SQL Server token cache:
services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString = _config["DistCache_ConnectionString"];
options.SchemaName = "dbo";
options.TableName = "TestCache";
});
トークン キャッシュ プロバイダーの詳細については、Microsoft.Identity.Web のトークン キャッシュのシリアル化に関する記事、および Web アプリのチュートリアルの ASP.NET Core Web アプリのチュートリアル | トークン キャッシュのフェーズもご覧ください。
詳細については、MSAL.NET のトークン キャッシュ シリアル化に関するページを参照してください。
MSAL Java では、トークン キャッシュをシリアル化および逆シリアル化するメソッドが提供されています。 Java のサンプルでは、セッションからのシリアル化が処理されています (AuthHelper.java#L99-L122 の getAuthResultBySilentFlow
メソッドを参照)。
IAuthenticationResult getAuthResultBySilentFlow(HttpServletRequest httpRequest, HttpServletResponse httpResponse)
throws Throwable {
IAuthenticationResult result = SessionManagementHelper.getAuthSessionObject(httpRequest);
IConfidentialClientApplication app = createClientApplication();
Object tokenCache = httpRequest.getSession().getAttribute("token_cache");
if (tokenCache != null) {
app.tokenCache().deserialize(tokenCache.toString());
}
SilentParameters parameters = SilentParameters.builder(
Collections.singleton("User.Read"),
result.account()).build();
CompletableFuture<IAuthenticationResult> future = app.acquireTokenSilently(parameters);
IAuthenticationResult updatedResult = future.get();
// Update session with latest token cache.
SessionManagementHelper.storeTokenCacheInSession(httpRequest, app.tokenCache().serialize());
return updatedResult;
}
SessionManagementHelper
クラスの詳細は、MSAL for Java のサンプルで提供されています。
Node.js サンプルでは、アプリケーション セッションを使用してトークン キャッシュを保存します。 MSAL ノード キャッシュ メソッドを使用すると、トークン要求が行われる前にセッション内のトークン キャッシュが読み取られ、トークン要求が正常に完了すると更新されます。 これを次に示します。
acquireToken(options = {}) {
return async (req, res, next) => {
try {
const msalInstance = this.getMsalInstance(this.msalConfig);
/**
* If a token cache exists in the session, deserialize it and set it as the
* cache for the new MSAL CCA instance. For more, see:
* https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-node/docs/caching.md
*/
if (req.session.tokenCache) {
msalInstance.getTokenCache().deserialize(req.session.tokenCache);
}
const tokenResponse = await msalInstance.acquireTokenSilent({
account: req.session.account,
scopes: options.scopes || [],
});
/**
* On successful token acquisition, write the updated token
* cache back to the session. For more, see:
* https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-node/docs/caching.md
*/
req.session.tokenCache = msalInstance.getTokenCache().serialize();
req.session.accessToken = tokenResponse.accessToken;
req.session.idToken = tokenResponse.idToken;
req.session.account = tokenResponse.account;
res.redirect(options.successRedirect);
} catch (error) {
if (error instanceof msal.InteractionRequiredAuthError) {
return this.login({
scopes: options.scopes || [],
redirectUri: options.redirectUri,
successRedirect: options.successRedirect || '/',
})(req, res, next);
}
next(error);
}
};
}
Python サンプルでは、ストレージにグローバル session
オブジェクトを使用して、identity パッケージによってトークン キャッシュが処理されます。
Flask には Cookie に格納されているセッションのサポートが組み込まれていますが、ID Cookie の長さにより、サンプルでは代わりに Flask セッション パッケージが使用されます。 すべては app.py で初期化されます。
import identity
import identity.web
import requests
from flask import Flask, redirect, render_template, request, session, url_for
from flask_session import Session
import app_config
app = Flask(__name__)
app.config.from_object(app_config)
Session(app)
auth = identity.web.Auth(
session=session,
authority=app.config["AUTHORITY"],
client_id=app.config["CLIENT_ID"],
client_credential=app.config["CLIENT_SECRET"],
)
app_config.py
の SESSION_TYPE="filesystem"
設定により、Flask セッション パッケージはローカル ファイル システムを使用してセッションを格納します。
運用環境では、"sqlachemy" や "redis" など、アプリの複数のインスタンスとデプロイにまたがって保持される設定を使用する必要があります。
この時点で、ユーザーがサインインすると、トークンはトークン キャッシュに格納されます。 それが Web アプリの他の部分でどのように使用されるかを見てみましょう。