gpt4 book ai didi

c# - 从 NET Core Web 应用程序调用 Microsoft Graph SDK 时出现 MsalUiRequiredException

转载 作者:行者123 更新时间:2023-12-02 22:54:14 27 4
gpt4 key购买 nike

我们有一个 NET Core 3.1 Web 应用程序,其中用户在 Azure AD 中使用 Microsoft.Identity.Web 进行身份验证。包裹。我们代表登录用户调用 Microsoft Graph SDK,如 here 中所述。 .

登录应用程序后,一切正常 - 对 Microsoft Graph SDK 的所有调用均成功。但是,大约 30-60 分钟后(我们没有准确计时),用户在我们的应用程序中保持身份验证,但对 Microsoft Graph SDK 的调用失败并出现以下错误:

IDW10502: An MsalUiRequiredException was thrown due to a challenge for the user.

内部异常有:

Microsoft.Identity.Client.MsalUiRequiredException: No account or login hint was passed to the AcquireTokenSilent call.

然后,用户需要注销应用程序并重新登录,之后对 MS Graph 的调用将在 30-60 分钟内再次成功。

有人能解释一下吗?

我们的设置

在 appsettings.json 中:

    {
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "<our-domain-name>",
"TenantId": "<our-tenant-id>",
"ClientId": "<our-client-id>",
"CallbackPath": "/signin-oidc",
"SignedOutCallbackPath ": "/signout-callback-oidc",
"ClientSecret": "<secret>"
},
"GraphBeta": {
"BaseUrl": "https://graph.microsoft.com/beta",
"Scopes": "User.Read Sites.Read.All Files.Read.All Sites.ReadWrite.All Files.ReadWrite.All",
"DefaultScope": "https://graph.microsoft.com/.default"
}

在 Startup.cs 中:

        services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp( Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi(new string[] { "User.Read","Sites.Read.All","Files.Read.All","Sites.ReadWrite.All","Files.ReadWrite.All" })
.AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
.AddDistributedTokenCaches();

services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString = Configuration.GetConnectionString("AzureConnection");
options.SchemaName = "dbo";
options.TableName = "TokenCache";
});

GraphServiceClient 被注入(inject)到我们的 Controller 中:

 readonly ITokenAcquisition tokenAcquisition;
private readonly GraphServiceClient graphServiceClient;

public SearchController(IConfiguration configuration, ITokenAcquisition _tokenAcquisition,
GraphServiceClient _graphServiceClient) : base(configuration)
{
tokenAcquisition = _tokenAcquisition;
graphServiceClient = _graphServiceClient;
}

相关 Action 用AuthorizeForScopes修饰:

      [AuthorizeForScopes(ScopeKeySection = "GraphBeta:Scopes")]
public async Task<IActionResult> Results(string queryString, int pageNumber, int pageSize)
{
...
}

然后调用 MS Graph,例如:

return await graphClient.Search.Query(requests).Request().PostAsync();

我们正在使用

  • Microsoft.Identity.Web 1.4.1
  • Microsoft.Identity.Web.MicrosoftGraphBeta 1.4.1
  • Microsoft.Graph.Beta 0.35.0-预览版
  • Microsoft.Graph.Auth 1.0.0-preview.6

最佳答案

在此处添加解决方案/解决方法 - 仅在 VS 中调试时才会出现此错误,因为 cookie 会保留,但服务器端 session 状态不会保留。如此快速地调试 Web 应用程序导致了此异常。

您可以通过添加一些异常处理中间件来解决这个问题,该中间件仅清除登录 cookie(这将重新执行交互式登录流程)。

您可以选择将其包装在开发环境条件中 (env.IsDevelopment()),但如果此错误在生产中发生,它也会妥善处理。

// Program.cs (C# 10, .NET 6)
app.UseExceptionHandler(new ExceptionHandlerOptions
{
ExceptionHandler = async ctx => {
var feature = ctx.Features.Get<IExceptionHandlerFeature>();
if (feature?.Error is MsalUiRequiredException
or { InnerException: MsalUiRequiredException }
or { InnerException.InnerException: MsalUiRequiredException })
{
ctx.Response.Cookies.Delete($"{CookieAuthenticationDefaults.CookiePrefix}{CookieAuthenticationDefaults.AuthenticationScheme}");
ctx.Response.Redirect(ctx.Request.GetEncodedPathAndQuery());
}
}
});

关于c# - 从 NET Core Web 应用程序调用 Microsoft Graph SDK 时出现 MsalUiRequiredException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65490775/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com