c# - 使用 Microsoft 帐户在 UWP 应用上单点登录未按预期工作
问题描述
我遇到了这样一种情况,我们的 UWP App 用户在登录时(使用他们的 Microsoft 帐户)必须始终输入他们的密码。
- 期待
用户使用他们的 Microsoft 帐户用户名和密码(例如 mrBigglesworth@mydomain.onmicrosoft.com)登录到我们的 UWP 应用程序。正常的“保持登录状态?” 对话框显示“不再显示”复选框。用户在此对话框中选择“是”。同一用户随后登录应用程序不会显示登录屏幕。实际上,这会创建单点登录体验。
这就是我们的应用在 2018 年 4 月使用现有代码更新到 Windows 10 之前的工作方式(见下文)。据我所知,这是使事情无法正常工作的更新。
- 怎么了
“保持登录状态?” 没有显示对话框 - 根本没有。因此,用户每次都必须提供密码。即使我清除了 cookie、缓存并以新用户(以前未使用过)登录或卸载应用程序,我仍然必须每次都提供密码。我们没有使用 ADFS,但在过去“有效”时也是如此。
我们的 UWP 应用是一个托管的 Web 应用,可将用户带到我们现有的 Web 门户。当我使用浏览器,清除缓存然后再次登录时,一切正常,我确实看到了“保持登录状态?” 对话。因此,缺少某些东西的是 UWP 功能。
- 做了什么
我们的 UWP 应用使用 WebView 控件来显示我们的 Web 门户。我有一个“注销用户”功能,它可以删除已知域的所有 cookie(参见下面的列表)并清除 WebView 缓存。域名列表是在 Fiddler 工具的帮助下编译的,用于在登录我们的 Web Portal 时监控所有URL/流量。此代码以前可以按预期工作(即用户退出并再次登录会产生“保持登录状态?”对话框)。我也尝试过卸载该应用程序,但没有任何乐趣(像 Azure PowerShell 脚本一样使用右键单击卸载 - “Get-AppxPackage | ? {$_.IsDevelopmentMode -eq “True”} | Remove-AppxPackage”)。
用于删除 cookie 和清除 WebView 缓存的 C# 代码片段如下(更改了一些特定于业务的字符串以保护无辜者)。
private static readonly string[] AllCookieDomains = {
"https://login.microsoftonline.com",
"https://login.mydomain.com",
"https://mydomain-us.azurewebsites.net",
"https://mydomaingraph-us.azurewebsites.net",
"https://mydomainlogin.azurewebsites.net",
"https://login.microsoftonline.com",
"https://mydomainapps.azurewebsites.net",
"https://secure.aadcdn.microsoftonline-p.com",
"https://login.microsoftonline.com/common/login",
"https://login.microsoftonline.com/common/oauth2/authorize"
};
foreach (string domainName in AllCookieDomains)
{
if (!String.IsNullOrWhiteSpace(domainName))
{
Uri aUri = new Uri(domainName);
foreach (var cookie in baseFilter.CookieManager.GetCookies(aUri))
{
baseFilter.CookieManager.DeleteCookie(cookie);
}
}
}
await WebView.ClearTemporaryWebDataAsync();
var filter = new HttpBaseProtocolFilter();
filter.ClearAuthenticationCache();
我可能已选中“保持登录状态?”上的“不再显示此内容”框。对话。我是否删除cookies/卸载应用程序无关紧要,但如果适用,如何重置它?
任何帮助/帮助将不胜感激。
附加信息:
如果您询问我的 WebView 代码,那么我的 MainPage 的摘录是:
<Grid x:Name="MainViewGrid" Grid.Row="1" Grid.ColumnSpan="8" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ScrollViewer HorizontalScrollMode="Disabled" VerticalScrollMode="Enabled" HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Auto">
<WebView x:Name="MainWebView" Source="{x:Bind ViewModel.WebViewSource, Mode=OneWay}" Margin="4,0,4,4"
NavigationStarting="MainWebView_NavigationStarting" NavigationCompleted="MainWebView_NavigationCompleted"
NewWindowRequested="MainWebView_NewWindowRequested" DefaultBackgroundColor="White"
ContainsFullScreenElementChanged="MainWebView_ContainsFullScreenElementChanged" RightTapped="MainWebView_RightTapped"
UnviewableContentIdentified="MainWebView_UnviewableContentIdentified" DOMContentLoaded="MainWebView_DOMContentLoaded">
</WebView>
</ScrollViewer>
</Grid>
查看模型 WebViewSource = new Uri(SkoolerResources.SkoolerLoginUrl_Metadata); // 我们应用的第一个 URL 是“ https://login.skooler.com/common/Metadata ”。
然后重定向到 login.microsoftonline.com(因为用户没有被授权)。
请注意,当我使用浏览器使用我们的门户网站时,一切正常。所以 WebView 中的一些登录信息是否被保留 - 这导致了 SSO 问题。
谢谢
解决方案
清除浏览器 cookie 应重置状态并清除“不再显示”设置。
“保持登录状态”对话框不显示的一些原因包括:
- 之前在浏览器中使用了不同的帐户(此状态也可以通过清除 cookie 来消除,如上所述)
- 浏览器中设置的某种形式的 SSO
- 加载到托管的 web 视图中
如果上述方法不能为您解决此问题,请向我发送一个登录的提琴手跟踪,其中“保持登录”对话框未显示,我可以查看它被抑制的原因。
推荐阅读
- virtual-reality - 从手模型中移除 XYZ 轴
- node.js - “ng serve”命令显示未处理的异常错误
- javascript - Quasar v2.0.3 中嵌套元素的上下文菜单
- python - Selenium 驱动程序无法返回 href 属性
- mongodb - 有效地计算 MongoDB 中数百万行的远距离值?
- javascript - 如何禁用 ChipInput(material-ui-chip-input)中特定值的删除选项?
- python - 将 panda 交叉表显示为表格
- hl7-fhir - Epic EMR FHIR refresh_token FHIR.OAuth2.Authorize()
- python - 错误:IndexError:索引 6319 超出轴 0 的范围,大小为 0
- python-3.x - 为pandas df中给定列中的每个值创建多行