在 Microsoft.Identity.Web 中使用 AzureAdB2C 时访问用户令牌
Accessing user token when using AzureAdB2C with Microsoft.Identity.Web
我有一个简单的 Blazor 服务器端应用程序,它使用 microsoft-identity-web 0.2.1-preview 包登录用户。
目的是使用 AzureAdB2C 登录提供身份验证,允许用户使用其 Microsoft 个人帐户登录并使用委托访问来调用 Microsoft Graph 函数。 (将来我想将其扩展到包括其他云提供商,因此使用 B2C)。
在我的 Startup.cs 中,我添加了 MicrosoftWebAppAuth 和我的服务,如下所示:
services.AddMicrosoftWebAppAuthentication(Configuration, "AzureAdB2C")
.AddMicrosoftWebAppCallsWebApi(Configuration, new string[] { "User.Read", Constants.ScopeSpecialFolder})
.AddInMemoryTokenCaches();
services.AddTransient<MyService>();
我的服务使用初始化的 ITokenAcquisition 正确调用
public MyService(ITokenAcquisition tokenAcquisition,
IOptions<WebOptions> webOptionValue, AuthenticationStateProvider AuthenticationStateProvider)
{
如果我随后调用 await tokenAcquisition.GetAccessTokenForAppAsync(scopes);
将抛出 NullReferenceException 并显示以下堆栈跟踪:
at Microsoft.Identity.Web.TokenAcquisition.<BuildConfidentialClientApplicationAsync>d__18.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
at Microsoft.Identity.Web.TokenAcquisition.<GetOrBuildConfidentialClientApplicationAsync>d__17.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
at Microsoft.Identity.Web.TokenAcquisition.<GetAccessTokenForAppAsync>d__15.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
确切的代码适用于 AzureAd 身份验证。我假设这不是使用 B2C 身份验证时访问用户令牌的正确方法?我应该调用什么来进行委托 Microsoft API 调用?
您正在使用 GetAccessTokenForAppAsync
这是一种使用客户端凭据获取应用程序访问令牌的方法(此处不涉及用户)。
你应该使用的是GetAccessTokenForUserAsync()
:
await tokenAcquisition.GetAccessTokenForUserAsync(scopes);
我有一个简单的 Blazor 服务器端应用程序,它使用 microsoft-identity-web 0.2.1-preview 包登录用户。
目的是使用 AzureAdB2C 登录提供身份验证,允许用户使用其 Microsoft 个人帐户登录并使用委托访问来调用 Microsoft Graph 函数。 (将来我想将其扩展到包括其他云提供商,因此使用 B2C)。
在我的 Startup.cs 中,我添加了 MicrosoftWebAppAuth 和我的服务,如下所示:
services.AddMicrosoftWebAppAuthentication(Configuration, "AzureAdB2C")
.AddMicrosoftWebAppCallsWebApi(Configuration, new string[] { "User.Read", Constants.ScopeSpecialFolder})
.AddInMemoryTokenCaches();
services.AddTransient<MyService>();
我的服务使用初始化的 ITokenAcquisition 正确调用
public MyService(ITokenAcquisition tokenAcquisition,
IOptions<WebOptions> webOptionValue, AuthenticationStateProvider AuthenticationStateProvider)
{
如果我随后调用 await tokenAcquisition.GetAccessTokenForAppAsync(scopes);
将抛出 NullReferenceException 并显示以下堆栈跟踪:
at Microsoft.Identity.Web.TokenAcquisition.<BuildConfidentialClientApplicationAsync>d__18.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
at Microsoft.Identity.Web.TokenAcquisition.<GetOrBuildConfidentialClientApplicationAsync>d__17.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
at Microsoft.Identity.Web.TokenAcquisition.<GetAccessTokenForAppAsync>d__15.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
确切的代码适用于 AzureAd 身份验证。我假设这不是使用 B2C 身份验证时访问用户令牌的正确方法?我应该调用什么来进行委托 Microsoft API 调用?
您正在使用 GetAccessTokenForAppAsync
这是一种使用客户端凭据获取应用程序访问令牌的方法(此处不涉及用户)。
你应该使用的是GetAccessTokenForUserAsync()
:
await tokenAcquisition.GetAccessTokenForUserAsync(scopes);