ADAL 4(实验性)对于 Windows Desktop/Native 和 Windows Phone 与 B2C 的行为不同

ADAL 4 (experimental) behaves differently for Windows Desktop/Native and Windows Phone with B2C

我想使用 Azure AD B2C 身份验证创建一个 Windows Phone 8.1 应用程序。 作为基础,我使用了 B2C Windows Desktop/Native Client sample.

桌面应用程序运行良好。在我采用 WP8.1 的过程中,我 运行 遇到了第一个问题,我想在此处获取令牌:

result = await authContext.AcquireTokenAsync(new string[] { Globals.clientId },
                null, Globals.clientId, new Uri(Globals.redirectUri),
                platformParams, Globals.signInPolicy);

虽然我为桌面应用程序获得了一个漂亮而闪亮的令牌,但对于 WP8.1 应用程序(从 WebAuthenticationBroker 返回后)我只获得了 ...?code=...... 响应。

我不确定,但对我来说,WP8.1 库似乎以一种 OIDC model 的方式工作,其中第一个调用转到 authorize 并且token 端点的第二个。

从那里开始我试图继续使用

收到的授权码
var result = await authContext.AcquireTokenByAuthorizationCodeAsync(authCode, new Uri(Globals.redirectUri),
                credApp, new string[] { "" }, Globals.signInPolicy );

但无论我如何尝试传递 ClientCredentialClientAssertion 我总是以普通的 结束400 错误请求(没有返回更多详细信息)。

有人请告诉我哪里错了and/or 指出正确的方向。

Windows Phone 8.1 使用延续模型,其中 WAB 调用调用应用程序。在 https://github.com/Azure-Samples/active-directory-dotnet-windowsphone-8.1/ to demo the flow or you can directly look at https://github.com/Azure-Samples/active-directory-dotnet-windowsphone-8.1/blob/master/TodoListClient/MainPage.xaml.cs

查看示例

您需要在页面上实现 IWebAuthenticationContinuable 接口。 }

    #region IWebAuthenticationContinuable implementation

    // This method is automatically invoked when the application is reactivated after an authentication interaction through WebAuthenticationBroker.        
    public async void ContinueWebAuthentication(WebAuthenticationBrokerContinuationEventArgs args)
    {
        // pass the authentication interaction results to ADAL, which will conclude the token acquisition operation and invoke the callback specified in AcquireTokenAndContinue.
        await authContext.ContinueAcquireTokenAsync(args);
    }
    #endregion

---------------------------------------- --------------------------

更新

我创建了一个新的 windows phone 应用程序并引用了 ADAL v4。我检查过延续模型不适用于 v4。它仅由 ADAL v2 使用。确保您使用的是 adal-v4。 我仍然必须添加以下代码

 protected override void OnActivated(IActivatedEventArgs args)
    {

        if (args is IWebAuthenticationBrokerContinuationEventArgs)
        {
            Microsoft.Experimental.IdentityModel.Clients.ActiveDirectory.WebAuthenticationBrokerContinuationHelper.SetWebAuthenticationBrokerContinuationEventArgs(args as IWebAuthenticationBrokerContinuationEventArgs);
        }

        base.OnActivated(args);
    }

这将恢复令牌获取过程和return访问令牌

我创建了一个完整的 运行 示例 Windows Phone 带有 Azure AD B2C 身份验证的 8.1 应用 here...

调查结果(与 ADAL v2 Azure AD 身份验证相比):

  • 不需要 ContinuationManager - 这在 ADAL v4SetWebAuthenticationBrokerContinuationEventArgs
  • 中涵盖
  • 使用这种方法代码在 AcquireTokenAsync
  • 之后直接继续执行