如何解决当 TokenAcquisition 失败时,如何处理 MicrosoftIdentityWebChallengeUserException? 缓解措施:
我正在构建一个 web 应用程序并在我重新启动应用程序并尝试使用 ITokenAcquisition.GetTokenForUserAsync
“发生了一个或多个错误。(IDW10502:由于对用户的挑战,引发了 MsalUiRequiredException。请参阅 https://aka.ms/ms-id-web/ca_incremental-consent。)”
我正在使用 Microsoft.Identity.Web 针对 Azure AD 对用户进行身份验证。
当我检查令牌缓存时,重新启动应用程序后它是空的。如果用户已经从较早的会话中登录,或者因为他们使用的是加入域的设备,他们似乎会绕过缓存。
如何强制重新验证或向缓存添加令牌?
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
// Handling SameSite cookie according to https://docs.microsoft.com/en-us/aspnet/core/security/samesite?view=aspnetcore-3.1
options.HandleSameSiteCookieCompatibility();
});
// Sign-in users with the Microsoft identity platform
services.AddMicrosoftIdentityWebAppAuthentication(Configuration)
.EnableTokenAcquisitionToCallDownstreamApi(new[] { "https://database.windows.net//.default" })
.AddInMemoryTokenCaches();
services.AddAuthorization(options =>
{
// By default,all incoming requests will be authorized according to the default policy
options.FallbackPolicy = options.DefaultPolicy;
});
services.AddDbContext<MyDatabaseContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MyAzureConnection")));
services.AddRazorPages()
.AddRazorRuntimeCompilation()
.AddMvcOptions(o => o.Filters.Add(new AuthorizeFilter()))
.AddMicrosoftIdentityUI();
}
我请求令牌的 DbContext
public MyDatabaseContext (ITokenAcquisition tokenAcquisition,DbContextOptions<MyDatabaseContext> options)
: base(options)
{
_tokenAcquisition = tokenAcquisition;
var token = _tokenAcquisition.GetAccessTokenForUserAsync(new[] {"https://database.windows.net//.default"});
var connection = (SqlConnection)Database.GetDbConnection();
connection.AccessToken = token.GetAwaiter().GetResult();
}
我所有的 PageModel 都装饰有 [AuthorizeForScopes(ScopeKeySection = "AzureSQL:BaseUrl")]
解决方法
此 error code 表示:
AADSTS65001:用户或管理员未同意使用 ID 为“{appId}”的应用程序名为“{appName}”。发送互动 对此用户和资源的授权请求。
缓解措施:
首先征得用户同意。如果您不使用 .NET Core(没有任何 Web UI),请调用(仅一次)AcquireTokeninteractive
。如果您使用 .NET Core 或不想执行 AcquireTokenInteractive
,用户可以导航到 URL 以表示同意:https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id={clientId}&response_type=code&scope=user.read
。致电AcquireTokenInteractive
:app.AcquireTokenInteractive(scopes).WithAccount(account).WithClaims(ex.Claims).ExecuteAsync();
就我而言,我在开发 .Net Core 3.1 Web 应用程序时遇到了 MicrosoftIdentityWebChallengeUserException
。我在控制器操作中的代码:
string[] scopes = new string[] { "user.read","https://storage.azure.com/user_impersonation" };
try
{
ViewData["token"] = await _tokenAcquisition.GetAccessTokenForUserAsync(scopes);
return View();
}
catch (MicrosoftIdentityWebChallengeUserException ex)
{
throw ex.MsalUiRequiredException;
}
注意 catch 块。 MicrosoftIdentityWebChallengeUserException
具有访问 MsalUiRequiredException
的属性。我不得不抛出该异常以强制身份 Web UI 再次显示同意 UI。我从this link那里得到了这个提示。查看其中的 MVC 控制器部分。它说,
AuthorizeForScopesAttribute 继承自 ExceptionFilterAttribute,这意味着它处理 MSAL.NET MsalUiRequiredException 以处理条件访问和增量同意。这也意味着,如果你捕获到 MSAL 异常,你应该重新抛出捕获到的 MSAL 异常,以便属性可以处理它
第二句话让我开心!它应该被突出显示以节省我们的时间。
附言这是我准备 AZ204 时的示例应用程序。一开始我没有包含存储模拟范围,但后来添加了它。然后应用程序开始抛出上述异常,我不得不想办法再次显示同意用户界面。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。