首页 > 解决方案 > 使用 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 问题。

谢谢

标签: c#webviewuwpsingle-sign-on

解决方案


清除浏览器 cookie 应重置状态并清除“不再显示”设置。

“保持登录状态”对话框不显示的一些原因包括:

  1. 之前在浏览器中使用了不同的帐户(此状态也可以通过清除 cookie 来消除,如上所述)
  2. 浏览器中设置的某种形式的 SSO
  3. 加载到托管的 web 视图中

如果上述方法不能为您解决此问题,请向我发送一个登录的提琴手跟踪,其中“保持登录”对话框未显示,我可以查看它被抑制的原因。


推荐阅读