如何在 MVC.net 中使用 MSAL 存储和检索访问令牌
How to store and retrieve Access Token using MSAL in MVC.net
我正在开发 ASP.Net MVC 经典应用程序。此应用程序获取访问令牌以访问 API 中的资源。一旦它获得访问令牌,然后我想存储它并在需要它时使用它来调用不同控制器中的 API 。但是,我想:
存储、检索和刷新想了解AcquireTokenSilently()。
我们可能会在用户登录 Startup.cs 后获取令牌,然后可以将其保存并检索以访问 API。因此,可能会检查过期令牌,然后静默刷新或获取令牌以访问 API 资源。所以任何流程都是有意义的。
我已经阅读了几个关于 MSAL 的文档,但没有得到清晰的图片,并且对 AcquireTokenSilently()、Refresh() 感到困惑。请参阅下面的代码,我正在访问令牌但我没有存储它。
private async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedNotification notification)
{
notification.HandleCodeRedemption();
var idClient = ConfidentialClientApplicationBuilder.Create(clientId)
.WithRedirectUri(redirectUri)
.WithClientSecret(clientSecret)
.WithAuthority(authority)
.Build();
try
{
var apiScope = "api://28178a67-4ae6-43d4-b708-c02785516b1d/asses_as_users api://28178a67-4ae6-43d4-b708-c02785516b1d/AzAdUtility.Get";
string[] scopes = apiScope.Split(' ');
var result = await idClient.AcquireTokenByAuthorizationCode(
scopes, notification.Code).ExecuteAsync();
}
catch (Exception ex)
{
string message = "AcquireTokenByAuthorizationCodeAsync threw an exception";
notification.HandleResponse();
notification.Response.Redirect($"/Home/Error?message={message}&debug={ex.Message}");
}
}
更新
下面的 link 指导我在 MVC.NET 经典中实现令牌缓存。我确实遇到了一些问题,但我确实想到了缓存令牌。
注意:当程序从 Visual Studio 停止或浏览器 window 关闭时,该问题与开发环境有关,缓存似乎丢失了。
https://github.com/Azure-Samples/ms-identity-aspnet-webapp-openidconnect
你不存储它。 MSAL 确实如此。它有一个 token cache built in to it. This cache is application specific so that it will need to acquire a token the first time each application is run. You can also use a Broker 可以从与当前登录用户关联的 OS 中提取令牌。
我正在开发 ASP.Net MVC 经典应用程序。此应用程序获取访问令牌以访问 API 中的资源。一旦它获得访问令牌,然后我想存储它并在需要它时使用它来调用不同控制器中的 API 。但是,我想:
存储、检索和刷新想了解AcquireTokenSilently()。
我们可能会在用户登录 Startup.cs 后获取令牌,然后可以将其保存并检索以访问 API。因此,可能会检查过期令牌,然后静默刷新或获取令牌以访问 API 资源。所以任何流程都是有意义的。
我已经阅读了几个关于 MSAL 的文档,但没有得到清晰的图片,并且对 AcquireTokenSilently()、Refresh() 感到困惑。请参阅下面的代码,我正在访问令牌但我没有存储它。
private async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedNotification notification)
{
notification.HandleCodeRedemption();
var idClient = ConfidentialClientApplicationBuilder.Create(clientId)
.WithRedirectUri(redirectUri)
.WithClientSecret(clientSecret)
.WithAuthority(authority)
.Build();
try
{
var apiScope = "api://28178a67-4ae6-43d4-b708-c02785516b1d/asses_as_users api://28178a67-4ae6-43d4-b708-c02785516b1d/AzAdUtility.Get";
string[] scopes = apiScope.Split(' ');
var result = await idClient.AcquireTokenByAuthorizationCode(
scopes, notification.Code).ExecuteAsync();
}
catch (Exception ex)
{
string message = "AcquireTokenByAuthorizationCodeAsync threw an exception";
notification.HandleResponse();
notification.Response.Redirect($"/Home/Error?message={message}&debug={ex.Message}");
}
}
更新 下面的 link 指导我在 MVC.NET 经典中实现令牌缓存。我确实遇到了一些问题,但我确实想到了缓存令牌。
注意:当程序从 Visual Studio 停止或浏览器 window 关闭时,该问题与开发环境有关,缓存似乎丢失了。
https://github.com/Azure-Samples/ms-identity-aspnet-webapp-openidconnect
你不存储它。 MSAL 确实如此。它有一个 token cache built in to it. This cache is application specific so that it will need to acquire a token the first time each application is run. You can also use a Broker 可以从与当前登录用户关联的 OS 中提取令牌。