【问题标题】:How can I handle MicrosoftIdentityWebChallengeUserException when TokenAcquisition fails?TokenAcquisition 失败时如何处理 MicrosoftIdentityWebChallengeUserException?
【发布时间】:2021-02-17 01:35:03
【问题描述】:

我正在构建一个 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();
        }

我所有的PageModels都用[AuthorizeForScopes(ScopeKeySection = "AzureSQL:BaseUrl")]装饰

【问题讨论】:

    标签: .net azure-active-directory azure-web-app-service msal .net-5


    【解决方案1】:

    这个error code 的意思是:

    AADSTS65001:用户或管理员未同意使用 ID 为“{appId}”的应用程序名为“{appName}”。发送互动 对此用户和资源的授权请求。

    缓解:

    首先征得用户同意。如果您没有使用 .NET Core(没有任何 Web UI),请致电(仅一次)AcquireTokeninteractive。如果您正在使用 .NET 核心或不想执行 AcquireTokenInteractive,用户可以导航到 URL 以表示同意:https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id={clientId}&amp;response_type=code&amp;scope=user.read。拨打AcquireTokenInteractive:app.AcquireTokenInteractive(scopes).WithAccount(account).WithClaims(ex.Claims).ExecuteAsync();

    【讨论】:

    【解决方案2】:

    就我而言,我在开发 .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 的属性。我不得不抛出该异常以强制 Identity Web UI 再次显示同意 UI。我从this link 那里得到了这个提示。查看其中的 MVC 控制器部分。它说,

    AuthorizeForScopesAttribute 继承自 ExceptionFilterAttribute,这意味着它处理 MSAL.NET MsalUiRequiredException 以处理条件访问和增量同意。这也意味着如果你捕捉到 MSAL 异常,你应该重新抛出捕捉到的 MSAL 异常,以便属性可以处理它

    第二句话让我很开心!它应该突出显示以节省我们的时间。

    附:这是我准备 AZ204 时的示例应用程序。我一开始没有包含存储模拟范围,但后来添加了它。然后应用程序开始抛出上述异常,我不得不找到一种再次显示同意 UI 的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多