MicrosoftIdentityWebChallengeUserException:连接到 Azure SQL Db 的 Web 应用程序已重新启动,用户无需事先注销即可访问它

问题描述

我正在使用 Net5.0 和 Microsoft.Identity.Web 构建 Razor 应用程序。该应用已委派用户模拟 Azure SQL 的权限。已在 Azure AD 中授予管理员许可。

我注意到,在我重新启动应用程序后,如果用户尚未注销或浏览器缓存已清除,应用程序会抛出以下错误:

'Microsoft.Identity.Web.MicrosoftIdentityWebChallengeUserException' 发生在 System.Private.CoreLib.dll 中,但未在用户中处理 代码:'IDW10502:由于一个 MsalUiRequiredException 被抛出 对用户的挑战。看 https://aka.ms/ms-id-web/ca_incremental-consent。 '内部异常 找到,请参阅变量窗口中的 $exception 以获取更多详细信息。最里面 异常 Microsoft.Identity.Client.MsalUiRequiredException :否 帐户或登录提示已传递给 AcquireTokenSilent 调用。

我已经阅读了关于增量同意的帖子,按照描述装饰了我的 PageModels,但唯一可以防止错误再次发生的方法是清除浏览器缓存或让用户退出然后再次进入。

我的 Startup.cs 中的相关元素

        public void ConfigureServices(IServiceCollection services)
        {

            // Sign-in users with the Microsoft identity platform
            services.AddMicrosoftIdentityWebAppAuthentication(Configuration,"AzureAd")
                .EnableTokenAcquisitionToCallDownstreamApi(new[]{"https://database.windows.net//.default"})

                // Adds the User and App InMemory Token Cache 
                .AddInMemoryTokenCaches();

            services.AddDbContext<MyDatabaseContext>(options =>
                    options.UseSqlServer(Configuration.GetConnectionString("MyAzureConnection")));

            services.AddScoped<ITodos,TodoData>();
            
            services.AddRazorPages()
                .AddMicrosoftIdentityUI();

        }

我的连接字符串:"MyAzureConnection": "Server=tcp:MYSERVER.database.windows.net,1433;Database=MYDATABASE;"

示例页面模型

    [AuthorizeForScopes(ScopeKeySection = "AzureSQL:BaseUrl")]

    public class IndexModel : PageModel
    {
        private readonly ITodos _todos;
        
        public IndexModel(ITodos todos)
        {
            _todos = todos;
        }

        public IList<Todo> Todo { get;set; }

        public async Task OnGetAsync()
        {
            Todo = await _todos.GetToDos();
        }
    }

我的尝试

我尝试使用 TokenAcquisitionOptions(如下)强制它从缓存中刷新令牌

        public AppDbContext(IHttpContextAccessor contextAccessor,ITokenAcquisition tokenAcquisition,DbContextOptions<AppDbContext> options)
            :base(options)
        {
            _contextAccessor = contextAccessor;
            _tokenAcquisition = tokenAcquisition;

            var user = _contextAccessor.HttpContext.User;
            string[] scopes = new[]{"https://database.windows.net//.default"};
            var connection = (SqlConnection)Database.GetDbConnection();

            TokenAcquisitionOptions tao = new TokenAcquisitionOptions();
            tao.Claims = user.Claims.ToString();
            tao.ForceRefresh = true;

            var result = _tokenAcquisition.GetAuthenticationResultForUserAsync(
                                    scopes,"TENANT ID HERE",null,user,tao)
                            .GetAwaiter()
                            .GetResult();
            connection.AccessToken = result.AccessToken;

只为用户请求访问令牌,只有范围和上面的附加参数

            var result = _tokenAcquisition.GetAccessTokenForUserAsync(scopes)
                            .GetAwaiter()
                            .GetResult();

当我使用 GetAccessTokenForAppAsync 它失败

发生类型为“Microsoft.Data.SqlClient.SqlException”的异常 在 Microsoft.EntityFrameworkCore.Relational.dll 中但未在 用户代码:'用户''登录失败。'

我真的不知道如何解决这个问题。只要我清除浏览器缓存或在重新启动后退出,我就可以正常访问该应用程序。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...