带有ASP.NET Core 3.1 Razor页面的Microsoft Identity Platform中存在可疑错误 [英] Suspected bug in Microsoft Identity Platform with ASP.NET Core 3.1 Razor Pages
问题描述
我正在开发一个托管在Azure应用程序服务环境中的应用程序,该环境由一个前端Web应用程序、一个后端Web API和一个SQL数据库(使用Azure SQL)组成。前端Web App是一款Razor Pages应用程序。我们正在尝试使用Microsoft Identity Platform(通过Microsoft.Identity.Web和Microsoft.Identity.Web.UI库)在需要时获取API的访问令牌。
第一次它工作得很好,但一旦获得并缓存了令牌-如果应用程序重新启动,它就会失败,并显示以下错误:
IDW10502:由于对用户的质询,引发了MsalUiRequiredException。请参见https://aka.ms/ms-id-web/ca_incremental-consent。
没有向AcquireTokenSilent调用传递任何帐户或登录提示。
启动配置是(我已经尝试了各种版本):
public void ConfigureServices(IServiceCollection services)
{
services.AddDistributedMemoryCache();
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
options.HandleSameSiteCookieCompatibility();
});
services.AddOptions();
services.AddMicrosoftIdentityWebAppAuthentication(Configuration)
.EnableTokenAcquisitionToCallDownstreamApi(new string[] { Configuration["Api:Scopes"] })
.AddInMemoryTokenCaches();
services.AddControllersWithViews(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
}).AddMicrosoftIdentityUI();
services.AddRazorPages().AddRazorRuntimeCompilation().AddMvcOptions(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
services.AddMvc();
//Other stuff...
}
我已经尝试了很多天,试图找到解决此问题的解决方法。我能赶上
错误,但我们似乎无法以编程方式采取任何操作来清除该问题(ITokenAcquisition界面不提供强制交互登录的选项)。
我发现这只是Razor Pages应用程序中的问题-启动代码几乎相同的基于控制器的MVC Web App不会出现此问题。
我还发现,通过创建基于控制器的测试MVC Web App,并使用与我们遇到问题的应用程序相同的客户端ID、租户ID等配置它,然后在主应用程序出现问题时立即启动它(在Visual Studio开发环境中),每次我都可以可靠地清除错误条件。然而,这显然不是一个可行的长期解决方案。
我在每个主要的技术论坛上都搜索过这个问题,看到许多类似的问题被提出,但没有一个确切地提供这个问题的解决方案。
复制:
- 创建ASP.NET Core 3.1 Web API。
- 创建调用该API的ASP.NET Core 3.1 Razor Pages Web应用程序。
- 向Azure Active Directory注册并将应用程序配置为请求令牌以访问API(根据各种MS文档)。
- 运行-如果一切设置正确,则将显示登录屏幕,并且一切都将正常工作。
- 停止Web App,等待几分钟,然后重新启动。现在将出现上面的错误。
我已就此向Microsoft提出支持请求-是否有其他人遇到此问题并找到解决方案?
推荐答案
我终于弄清了这件事的真相,这在很大程度上要归功于:https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/issues/216#issuecomment-560150172
总而言之-对于其他有此问题的人:
- 第一次调用Web应用时,您尚未登录,因此会被重定向到Microsoft Identity Platform登录,该登录会让您登录并颁发访问令牌。
- 访问令牌通过回调存储在内存令牌缓存中。
- 由于令牌在缓存中,因此全部按预期工作。
- 当您停止Web应用,然后在相当短的时间内重新启动Web应用时,它会使用身份验证Cookie获取仍然是当前的登录,因此它不会访问身份平台,您也不会获得访问令牌。
- 当您请求令牌时,缓存为空,因此它会引发MsalUiRequiredException异常。
没有在任何文档中真正明确说明的是,这是应该发生的,并且该异常是由";AuthorizeForScope";属性拾取的,但前提是您允许该异常一直发生并且不尝试处理它。
另一个问题是,在Razor Pages应用程序中,正常的AuthorizeForScope属性必须位于每个页面的模型类定义之上-如果您遗漏了一个,可能会触发上述问题。
&qot;jasonsare";在链接文章中提出的解决方案通过使用筛选器替换属性来解决该问题,因此它将应用于所有页面。
也许我有点守旧,但是使用未处理的异常作为计划的程序控制流的一部分的想法并不适合我-至少应该清楚地表明这是我的意图。不管怎样-问题现在解决了。
这篇关于带有ASP.NET Core 3.1 Razor页面的Microsoft Identity Platform中存在可疑错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!