다음 Microsoft 라이브러리는 웹앱을 지원합니다.
관심 있는 플랫폼에 대한 탭을 선택합니다.
클라이언트 암호 또는 클라이언트 인증서
이제 웹앱이 다운스트림 웹 API를 호출하므로 appsettings.json 파일에 클라이언트 암호나 클라이언트 인증서를 제공합니다. 다음을 지정하는 섹션을 추가할 수도 있습니다.
- 다운스트림 웹 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"]
}
}
참고 항목
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"]
}
}
Warning
Scopes
를 배열로 변경하는 것을 잊은 경우 IDownstreamApi
를 사용하려고 하면 범위가 null로 나타나고 IDownstreamApi
는 다운스트림 API에 대해 익명(인증되지 않은) 호출을 시도합니다. 401/unauthenticated
.
Microsoft.Identity.Web은 구성이나 코드를 통해 인증서를 설명 하는 여러 가지 방법을 제공합니다. 자세한 내용은 GitHub에서 Microsoft.Identity.Web - 인증서 사용을 참조하세요.
Startup.cs 파일 수정
웹앱은 다운스트림 API에 대한 토큰을 획득해야 합니다. .AddMicrosoftIdentityWebApp(Configuration)
뒤에 .EnableTokenAcquisitionToCallDownstreamApi()
줄을 추가하여 이를 지정합니다. 이 줄은 컨트롤러 및 페이지 작업에서 사용할 수 있는 IAuthorizationHeaderProvider
서비스를 제공합니다. 그러나 다음 두 가지 옵션에 표시 된 것처럼 더 간단하게 수행할 수 있습니다. 또한 .AddInMemoryTokenCaches()
처럼 Startup.cs에서 토큰 캐시 구현을 선택해야 합니다.
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
에 전달되는 범위는 선택 사항이며, 웹앱이 범위를 요청하고 사용자가 로그인할 때 범위에 사용자 동의를 요청할 수 있도록 합니다. 범위를 지정하지 않으면 Microsoft.Identity.Web이 증분 동의 환경을 사용하도록 설정합니다.
Microsoft.Identity.Web은 토큰을 얻지 않고도 웹앱에서 웹 API를 호출할 수 있는 두 가지 메커니즘을 제공합니다. 선택할 옵션은 Microsoft Graph 또는 다른 API를 호출하는지 여부에 따라 달라집니다.
옵션 1: Microsoft Graph 호출
Microsoft Graph를 호출하려면 Microsoft.Identity.Web을 통해 직접 GraphServiceClient
(Microsoft Graph SDK에 의해 노출됨)를 API 작업에 사용할 수 있습니다. Microsoft Graph를 공개하려면:
프로젝트에 Microsoft.Identity.Web.GraphServiceClient NuGet 패키지를 추가합니다.
.AddMicrosoftGraph()
을 .EnableTokenAcquisitionToCallDownstreamApi()
뒤에, Startup.cs 파일에서 추가합니다. .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 이외의 다운스트림 웹 API 호출
Microsoft Graph 이외의 API를 호출하려는 경우 Microsoft.Identity.Web을 사용하면 API 작업에서 IDownstreamApi
인터페이스를 사용할 수 있습니다. 이 인터페이스를 사용하려면:
프로젝트에 Microsoft.Identity.Web.DownstreamApi NuGet 패키지를 추가합니다.
.AddDownstreamApi()
을 .EnableTokenAcquisitionToCallDownstreamApi()
뒤에, Startup.cs 파일에서 추가합니다. .AddDownstreamApi()
에는 두 개의 인수가 있으며 다음 코드 조각에 표시됩니다.
- 해당 구성을 참조하기 위해 컨트롤러 작업에서 사용되는 서비스(API)의 이름
- 다운스트림 웹 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();
// ...
}
// ...
}
요약
웹 API와 마찬가지로 다양 한 토큰 캐시 구현을 선택할 수 있습니다. 자세한 내용은 GitHub의 Microsoft.Identity.Web - 토큰 캐시 serialization을 참조하세요.
다음 이미지는 Microsoft.Identity.Web의 다양한 가능성과 Startup.cs 파일에 미치는 영향을 보여줍니다.
클라이언트 암호 또는 클라이언트 인증서
이제 웹앱이 다운스트림 웹 API를 호출하므로 appsettings.json 파일에 클라이언트 암호나 클라이언트 인증서를 제공합니다. 다음을 지정하는 섹션을 추가할 수도 있습니다.
- 다운스트림 웹 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"]
}
}
참고 항목
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"]
}
}
Warning
Scopes
를 배열로 변경하는 것을 잊은 경우 IDownstreamApi
를 사용하려고 하면 범위가 null로 나타나고 IDownstreamApi
는 다운스트림 API에 대해 익명(인증되지 않은) 호출을 시도합니다. 401/unauthenticated
.
Microsoft.Identity.Web은 구성이나 코드를 통해 인증서를 설명 하는 여러 가지 방법을 제공합니다. 자세한 내용은 GitHub에서 Microsoft.Identity.Web - 인증서 사용을 참조하세요.
Startup.Auth.cs
웹앱은 다운스트림 API에 대한 토큰을 획득해야 합니다. Microsoft.Identity.Web은 웹앱에서 웹 API를 호출하기 위한 두 가지 메커니즘을 제공합니다. 선택할 옵션은 Microsoft Graph 또는 다른 API를 호출하는지 여부에 따라 달라집니다.
옵션 1: Microsoft Graph 호출
Microsoft Graph를 호출하려면 Microsoft.Identity.Web을 통해 직접 GraphServiceClient
(Microsoft Graph SDK에 의해 노출됨)를 API 작업에 사용할 수 있습니다. Microsoft Graph를 공개하려면:
- 프로젝트에 Microsoft.Identity.Web.GraphServiceClient NuGet 패키지를 추가합니다.
- Startup.Auth.cs 파일의 서비스 컬렉션에
.AddMicrosoftGraph()
를 추가합니다. .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 이외의 다운스트림 웹 API 호출
Microsoft Graph 이외의 API를 호출하려는 경우 Microsoft.Identity.Web을 사용하면 API 작업에서 IDownstreamApi
인터페이스를 사용할 수 있습니다. 이 인터페이스를 사용하려면:
- 프로젝트에 Microsoft.Identity.Web.DownstreamApi NuGet 패키지를 추가합니다.
.AddDownstreamApi()
을 .EnableTokenAcquisitionToCallDownstreamApi()
뒤에, Startup.cs 파일에서 추가합니다. .AddDownstreamApi()
에는 다음의 두 가지 인수가 있습니다.
- 서비스 이름(API): 컨트롤러 작업에서 이 이름을 사용하여 해당 구성을 참조합니다.
- 다운스트림 웹 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 - 토큰 캐시 serialization을 참조하세요.
다음 이미지는 Microsoft.Identity.Web의 다양한 가능성과 Startup.cs 파일에 미치는 영향을 보여줍니다.
이 문서 및 다음 예제의 코드 예제는 ASP.NET 웹앱 샘플에서 추출됩니다. 전체 구현에 대한 자세한 내용은 해당 샘플을 참조하는 것이 좋습니다.
Java 코드 샘플 구현
이 문서 및 다음 예제의 코드 예제는 Java용 MSAL을 사용하는 웹앱 샘플인 Microsoft Graph를 호출하는 Java 웹 애플리케이션에서 추출됩니다.
샘플은 현재 Java용 MSAL에서 권한 부여 코드 URL을 생성하고 Microsoft ID 플랫폼에 대한 권한 부여 엔드포인트 탐색을 처리합니다. 스프린트 보안을 사용하여 사용자를 로그인할 수도 있습니다. 전체 구현에 대한 자세한 내용은 샘플을 참조하는 것이 좋습니다.
Node.js 코드 샘플 구현
이 문서와 다음 문서의 코드 예는 MSAL Node를 사용하는 웹앱 샘플인 Microsoft Graph를 호출하는 Node.js 및 Express.js 웹 애플리케이션에서 추출되었습니다.
샘플은 현재 MSAL Node에서 권한 부여 코드 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);
}
};
}
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);
}
}
}
사용자를 로그인하는 웹앱: 코드 구성을 참조하여 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 샘플이 인증 코드를 가져오는 방법을 이해하려면 사용자를 로그인하는 웹앱: 코드 구성을 참조하세요.
Microsoft 로그인 화면에서는 앱 등록에 지정된 /getAToken
URL로 인증 코드를 보냅니다. auth_response
경로는 해당 URL을 처리하고 auth.complete_login
을 호출하여 인증 코드를 처리한 다음 오류를 반환하거나 홈페이지로 리디렉션합니다.
@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의 토큰 캐시 직렬화 문서와 웹앱 자습서의 ASP.NET Core 웹앱 자습서 | 토큰 캐시 단계를 참조하세요.
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 Token cache serialization 문서 및 ASP.NET Core 웹앱 자습서를 참조하세요. | 토큰은 웹앱 자습서의 단계를 캐시합니다.
자세한 내용은 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
클래스의 세부 정보는 Java용 MSAL 샘플에 제공됩니다.
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 샘플에서 ID 패키지는 스토리지를 위해 전역 session
개체를 사용하여 토큰 캐시를 관리합니다.
Flask에는 쿠키에 저장된 세션에 대한 지원 기능이 기본 제공되어 있지만 ID 쿠키의 길이로 인해 샘플에서는 대신 Flask-session 패키지를 사용합니다. 모든 것이 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"와 같이 앱의 여러 인스턴스 및 배포에 걸쳐 지속되는 설정을 사용해야 합니다.
이 시점에서 사용자가 로그인하면 토큰이 토큰 캐시에 저장됩니다. 웹앱의 다른 부분에서 사용되는 방법을 살펴보겠습니다.