1

我的问题是:当我使用微软的项目时,标题中提到的那行代码运行并验证正确,我可以对用户进行操作,如“B2CGraphClient”示例项目所示。但是,当我复制并粘贴B2CGraphClient.cs到我的 Web 应用程序中时,这行代码会永远挂起。怎么会这样?

挂起的行是 #184 in B2CGraphClient.cs

详情:我正在使用本文中提到的名为“B2CGraphClient”的示例项目,其压缩文件位于此处。这些文件需要设置变量clientIdclientSecrettenant,我能够正确设置这些变量以适合我的 AAD B2C 实例。当我将B2CGraphClient.cs代码复制到我的 Web 应用程序项目中时,这些变量的值也被正确设置,所以我认为这不是问题。

线索:这些观察结果可能是问题所在:

  1. 运行 Microsoft 示例“B2CGraphClient”代码时,它不需要用户对 Web 应用程序进行身份验证;但是,我的 Web 应用程序确实需要用户在使用 Graph 客户端之前输入他/她的用户名/密码。
  2. 当标题中的代码行在我的 Web 应用程序中运行时,以下是浏览器中的 URL:https://login.microsoftonline.com/<my_domain>.onmicrosoft.com/B2C_1_SiUpIn/......我知道B2C_1_SiUpIn策略名称不应该在此 URL 中。但是我该如何解决这个问题?

谢谢!


更新

我发布了初始化 B2CGraphClient 的代码,它表明(至少在我看来)为创建其凭据而传递给客户端的唯一信息是clientIdclientSecrettenant名称。

    public B2CGraphClient(string clientId, string clientSecret, string tenant)
    {
        // The client_id, client_secret, and tenant are pulled in from the App.config file
        this.clientId = clientId;
        this.clientSecret = clientSecret;
        this.tenant = tenant;

        // The AuthenticationContext is ADAL's primary class, in which you indicate the direcotry to use.
        this.authContext = new AuthenticationContext("https://login.microsoftonline.com/" + tenant);

        // The ClientCredential is where you pass in your client_id and client_secret, which are 
        // provided to Azure AD in order to receive an access_token using the app's identity.
        this.credential = new ClientCredential(clientId, clientSecret);
    }

credential稍后用于对图形客户端进行身份验证:

        AuthenticationResult result = await authContext.AcquireTokenAsync(aadGraphResourceId, credential);
4

1 回答 1

2

B2CGraphClient已为控制台应用程序开发。

要集成B2CGraphClient到 Web 应用程序中,您应该将AcquireToken调用从同步方法更改为异步方法。

例如从:

AuthenticationResult authResult = authContext.AcquireToken("https://graph.windows.net", credential);

至:

AuthenticationResult authResult = await authContext.AcquireTokenAsync("https://graph.windows.net", credential);

于 2018-03-17T00:05:02.917 回答