我正在WPF应用程序中使用MSAL.NET库,以使用交互式令牌获取工作流为MSA帐户获取访问令牌。以下是令牌获取的相关代码段:
PublicClientApplication PublicClientApp = new PublicClientApplication("The-Application-Id", "https://login.microsoftonline.com/consumers/", TokenCacheHelper.GetUserCache());
var authResult = await publicClientApplication.AcquireTokenAsync(new string[] { "email" });
其中TokenCacheHelper来自documentation。这个工作正常,我可以在结果中获取访问令牌和ID令牌。但是,如果下次我使用同一帐户登录,则再次需要我同意个人资料和电子邮件范围。无论我登录并提供同意的次数是多少,它仍在征求我的同意。我在account.live上检查了我的当前状态,并说已经为上述申请提供了同意书。我浏览了多个文档,但没有运气。有人可以提供任何指针吗?
P.S。上面是一个支持本机的融合应用程序,我之所以不使用AcquireTokenSilentAsync是因为我希望多个MSA帐户能够登录安装在同一设备上的应用程序。
编辑:我尝试使用不带令牌缓存的PublicClientApplication(因此使用库默认值),但仍然观察到相同的行为。为了进一步了解该行为,我在使用MSAL登录MSA期间捕获了Fiddler跟踪。在下面的跟踪中,观察到对/ Consent / Update的调用,这是导致每次登录时都请求同意的原因。知道如何关闭此功能吗?
答案 0 :(得分:0)
MSA团队的开发人员和PO确认这是预期的行为。他们updated文档以反映此信息。这是文档中的相关部分:
总而言之,如果您的用户使用每台设备一个MSA帐户的应用程序,则建议的MSAL使用模式将确保仅一次向用户征求同意(除非以某种方式删除了缓存)。如果您的用户通过每个设备的多个MSA帐户进行操作,则可以利用“公共客户端应用程序”(使用现有令牌缓存实例化)来获取为其缓存令牌的MSA帐户列表。使用自定义UI,您可以向用户提供帐户列表,并根据用户的选择,以静默方式获取访问令牌,从而防止出现同意屏幕。请注意,只有保留令牌缓存,才能征得同意。删除令牌缓存文件将迫使用户在同意的情况下重新登录。