首页 > 解决方案 > MSAL 要求用户在每次登录 WPF 桌面应用程序时征得用户同意

问题描述

我在 WPF 应用程序中使用 MSAL.NET 库使用交互式令牌获取工作流获取 MSA 帐户的访问令牌。以下是获取token的相关代码:

PublicClientApplication PublicClientApp = new PublicClientApplication("The-Application-Id", "https://login.microsoftonline.com/consumers/", TokenCacheHelper.GetUserCache());
var authResult = await publicClientApplication.AcquireTokenAsync(new string[] { "email" });

其中 TokenCacheHelper 取自文档。这工作正常,我能够在结果中获得访问令牌和 ID 令牌。但是,如果下次我使用同一个帐户登录,我需要再次同意个人资料和电子邮件范围。无论我登录并提供同意的次数如何,它仍然在征求我的同意。我在 account.live 上检查了我的当前状态,它说已经为上述应用程序提供了同意。我已经阅读了多个文档,但没有运气。有人可以提供任何指示吗?

描述同一用户的重复同意提示的图像

PS 以上是一个支持本机的融合应用程序,我不使用 AcquireTokenSilentAsync 的原因是因为我希望多个 MSA 帐户能够登录安装在同一设备上的应用程序。

编辑:我尝试使用没有令牌缓存的 PublicClientApplication(因此使用库默认值),但仍然观察到相同的行为。为了进一步了解该行为,我在使用 MSAL 登录 MSA 期间捕获了 Fiddler 跟踪。从下面的跟踪中,可以观察到对 /Consent/Update 的调用,这就是导致每次登录时都请求同意的原因。知道如何关闭它吗?

在此处输入图像描述

标签: c#wpfauthenticationazure-active-directorymsal

解决方案


MSA 团队的开发人员和 PO 确认这是预期行为。他们更新了文档以反映此信息。以下是文档中的相关部分:

在此处输入图像描述

总而言之,如果您的用户在每台设备上使用一个 MSA 帐户的应用程序,那么推荐的 MSAL 使用模式将确保只向用户征求一次同意 [除非缓存以某种方式被删除]。如果您的用户通过每个设备的多个 MSA 帐户进行操作,那么您可以利用公共客户端应用程序(使用现有令牌缓存实例化)来获取为其缓存令牌的 MSA 帐户列表。使用自定义 UI,您可以向用户提供帐户列表,并根据他/她的选择,静默获取访问令牌,从而防止出现同意屏幕。请注意,只有在令牌缓存仍然存在的情况下,同意才能被制服。删除令牌缓存文件将强制用户在同意的情况下重新登录。


推荐阅读