MS Graph外部用户401无法通信

时间:2018-05-23 19:59:18

标签: c# microsoft-graph outlook-restapi

在浏览类似问题后,我会尝试总结一下我的情景:

  1. Azure租户,包含本机应用程序和管理员用户帐户。当管理员帐户工作时,从应用程序访问MS Graph API。

  2. 我有一个outlook.com帐户,使用MS Graph Explorer工作来阅读电子邮件。

  3. 我使用管理员帐户邀请外部outlook.com帐户。我将此外部用户添加到应用程序的用户,O365订阅许可证,我仔细检查了我从Graph Explorer中看到的相同授权权限,包括Mail.Read等。已验证令牌具有这些权限。

  4. 我甚至尝试让外部用户成为全球管理员进行测试,但是......使用outlook.com信用卡从本机应用程序访问MS Graph API会产生401 Unauthorized

  5. 如果我从原生应用程序中复制完整的URI并粘贴到MS Graph中,则可以正常工作。

  6. 这是我们的原生和网络应用调用代码:

    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization =
        new AuthenticationHeaderValue("Bearer", token);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept
        .Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
    var requestUri = $"{MSGraphUtils.GraphResource}/{MSGraphUtils.VERSION}/{request}";
    var response = await client.GetAsync(requestUri);
    var responseContent = await response.Content.ReadAsStringAsync()
    

    requestUri已完成令牌,{request}附加为: https://graph.microsoft.com/v1.0/me/mailfoldersme/mailfolders/{id}/messages

    而不是/me,我也尝试了/users/{id|UPN}

    如果我只发送https://graph.microsoft.com/v1.0/me,则回复是正确的基本个人资料,但只要添加/mailfolders/messages,我就会得到401 Unauthorized

    {
      "error": {
        "code": "UnknownError",
        "message": "",
        "innerError": {
          "request-id": "551340c6-1753-41d5-bc1a-e3ccdbc98e00",
          "date": "2018-05-24T13:48:23"
        }
      }
    }
    

    如果我使用令牌复制整个requestUri并将其直接粘贴到Microsoft Graph Explorer中,它将与/mailfolders一起使用。

    同时添加具有已授予权限的令牌scp

    Calendars.ReadWrite 
    Contacts.ReadWrite 
    Files.ReadWrite.All 
    Mail.Read 
    Mail.ReadWrite 
    Notes.ReadWrite.All 
    People.Read 
    Sites.Read.All 
    Tasks.ReadWrite 
    User.Read 
    User.ReadBasic.All 
    User.ReadWrite
    

    获得令牌:

    public static string Authority = "https://login.windows.net/common";
    public static string GraphResource = "https://graph.microsoft.com";
    public static string ReturnUri = "urn:ietf:wg:oauth:2.0:oob";
    
    public static Task Authenticate(Account account)
    {
        return Task.Run(async () =>
    
        var authContext = new AuthenticationContext(Authority);
    
        if (authContext.TokenCache.ReadItems().Any())
             authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority);
    
        var platformParams = new PlatformParameters(PromptBehavior.Auto);
    
        var result = await authContext.AcquireTokenAsync(GraphResource, CLIENT_ID, new Uri(ReturnUri), platformParams);
    
        if (result != null)
        {
           account.token = result.AccessToken;
        }
        });
    }
    

1 个答案:

答案 0 :(得分:0)

当用户对您的租户进行身份验证时,您只能访问租户控制的数据。换句话说,如果jdoe@outlook.comyourtenant.onmicrosoft.com租户进行身份验证,则您无法访问其outlook.com电子邮件。

您可以从Graph Explorer中看到outlook.com电子邮件的原因是Graph Explorer正在针对其outlook.com帐户进行身份验证。换句话说,Graph Explorer正在针对jdoe@outlook.com租户对outlook.com进行身份验证,而不是yourtenant.onmicrosoft.com

当用户针对给定租户进行身份验证时,该令牌仅提供对该单个租户内数据的访问。 Microsoft Graph不允许您跨租户边界。