【问题标题】:Azure Active Directory silent SSO (token retrieval) for client application客户端应用程序的 Azure Active Directory 静默 SSO(令牌检索)
【发布时间】:2018-11-30 01:59:09
【问题描述】:

我有一个客户端应用程序,我想检查 azure 广告令牌声明。通过客户端应用程序,我指的是在 Windows 10 桌面上运行的可执行文件或在用户上下文中运行的 UWP 应用程序。

我试过了:

var authenticationContext =
    new AuthenticationContext("https://login.microsoftonline.com/common");

var userCredential = new UserCredential();

var result = await authenticationContext
    .AcquireTokenAsync("https://graph.microsoft.com/.default",
        "https://mytenant.onmicrosoft.com/myguid",
        userCredential);

password_required_for_managed_user 失败。

可用文档声称此方法使用 Kerberos,如果属实,Azure ADd 不支持 Kerberos,因此会失败。

var _publicClientApp = new PublicClientApplication(clientId);
var user = new ApplicationUser {
    DisplayableId = upn,
    Identifier = Guid.NewGuid().ToString()
    // other fields can be null
};

var authenticationResult =
    await _publicClientApp.AcquireTokenSilentAsync(_scopes, user);

抛出MsalUiRequiredException (no token in cache)

这不再使用 ADAL,它使用 AcquireTokenSilentAsync 的不同实现:

var authContext =
    new AuthenticationContext("https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
        Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCache.DefaultShared);

var result =
    await authContext.AcquireTokenSilentAsync("https://graph.microsoft.com/.default", upn);

这会返回相同的MsalUiRequiredException

我很茫然。对于 Web 应用程序,浏览器缓存中会有一个 cookie,我可以使用标准运行时执行静默 SSO。

我是否必须在我的应用程序中嵌入一个网络服务器才能做到这一点?

【问题讨论】:

    标签: c# oauth-2.0 azure-active-directory azure-authentication


    【解决方案1】:

    AcquireTokenSilentAsync 使用现有的refresh_token 来获取更新的access_token。由于您尚未获得令牌,因此它失败了(因此出现“缓存中没有令牌”错误)。

    您需要提供一个备用方案来处理您没有可用的有效refresh_token 的情况:

    AuthenticationResult authResult = null;
    string[] scopes = new string[] { "user.read", "mail.read" };
    try 
    {
        authResult = await App
            .PublicClientApp
            .AcquireTokenSilentAsync(
                scopes, 
                App.PublicClientApp.Users.FirstOrDefault());
    } 
    catch (MsalUiRequiredException ex) 
    {
        // MSAL couldn't get the token silently, so go through the interactive process
        authResult = await App
            .PublicClientApp
            .AcquireTokenAsync(scopes);
    }
    

    还有一些针对经典应用和 UWP 应用进行设置的演练:

    【讨论】:

    • 目标是让操作保持静默。我知道 AcquireTokenAsync 回退,但是它不再沉默。我知道机器上有一个令牌在浏览器 cookie 存储中,可能在其他地方,正在寻找正确的 API 来检索它
    • OAuth 不能那样工作。除非您有应用程序的令牌,否则在当前会话中,您没有可以静默刷新的令牌。
    • 在静默 SSO 场景中,我可以从一个网站转到另一个网站,并且不会再次提示我在第二个网站进行身份验证。这似乎表明这确实是可能的。此外,我已经建立了一个简单的网站,它也可以工作。该站点使用自己的应用程序 ID 接收令牌,而无需进一步的用户输入。 Windows 中还有一个(未记录的)API 可以做同样的事情。
    • 如果这是一个网站,那么是的,它可能几乎是无声的(从技术上讲,它会重定向到 auth 端点,但由于您已经登录,它会立即将用户重定向回来)。这是有效的,因为 cookie 由 auth 端点拥有,而不是您的应用程序。由于两个应用程序共享相同的身份验证端点,因此它使用现有的身份验证 cookie(请记住,这是对流程的总体简化)。使用本机应用程序,您没有任何 cookie。唯一的应用程序您的应用程序,因此它拥有的唯一令牌是它自己检索到的令牌。您的应用无法重复使用浏览器沙箱中的数据。
    • 另外请记住,每个 SSO 架构都有一个后备策略。如果/当 SSO 过程失败时,如果没有一个,您会让用户感到头晕目眩。
    猜你喜欢
    • 2020-02-15
    • 2017-03-07
    • 2017-07-29
    • 1970-01-01
    • 2016-03-28
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    相关资源
    最近更新 更多