"Tenant does not have a SPO license" 尝试使用图形 API 访问驱动器项目时

"Tenant does not have a SPO license" when trying to access drive items with GraphAPI

我正在尝试了解如何配置 dotnet 核心 Web 应用程序以允许我使用个人 Microsoft 帐户登录并浏览我的 OneDrive 文件。

首先,我使用了 Microsoft Graph Explorer, signed in using the account I want to use, and verified that I can browse my drive. There it tells me the query URL is https://graph.microsoft.com/v1.0/me/drive/root/children,它使用的是 Graph API 的 v1.0。甚至还有一个 c# 代码片段选项卡向我展示了这一点:

GraphServiceClient graphClient = new GraphServiceClient( authProvider );

var children = await graphClient.Me.Drive.Root.Children
    .Request()
    .GetAsync();

因此,在我的 dotnet 核心 Web 应用程序中,我完成了以下操作。在 Startup:

    string[] initialScopes = Configuration.GetValue<string>("GraphApi:Scopes")?.Split(' ');
        
        services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
            .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
            .EnableTokenAcquisitionToCallDownstreamApi(initialScopes)
            .AddMicrosoftGraph(Configuration.GetSection("GraphApi"))
            .AddInMemoryTokenCaches();

appsettings.json:

  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "<my-domain>.onmicrosoft.com",
    "TenantId": "<tenant-guid-identifier>",
    "ClientId": "<client-id>",
    "ClientSecret": "<client-secret>",
    "CallbackPath": "/signin-oidc"
  },
  "GraphApi": {
    "BaseUrl": "https://graph.microsoft.com/v1.0",
    "Scopes": "user.read files.read.all"
  }

和一个测试控制器:

    [Authorize]
    public class OneDriveController : Controller
    {
        private readonly GraphServiceClient _graphServiceClient;

        public OneDriveController(GraphServiceClient graphServiceClient)
        {
            _graphServiceClient = graphServiceClient;
        }

        [AuthorizeForScopes(ScopeKeySection = "GraphApi:Scopes")]
        public async Task<IActionResult> Index()
        {
            var user = await _graphServiceClient.Me.Request().GetAsync();

            var driveItems = await _graphServiceClient.Me.Drive.Root.Children.Request().GetAsync();

            return Json(new
            {
                user = user.DisplayName,
                items = driveItems.Count
            });
        }
    }

对于客户端凭据,我在我的 Azure 门户中创建了一个应用程序注册,其中设置了 Graph API peermissions user.readfiles.read.all,并添加了一个客户端密码。我不太确定的身份验证部分。尽管我使用相同的个人 Microsoft 帐户访问 Azure 门户和 OneDrive,但这不是企业场景,所以我选择了多租户访问。

当我 运行 这个应用程序并浏览到我的测试控制器处理的路由时,我被重定向到我登录的 Microsoft OAuth 流程。回到应用程序行 _graphServiceClient.Me.Request().GetAsync() returns 我刚刚登录的帐户的用户配置文件。但是,下一行(_graphServiceClient.Me.Drive.Root.Children.Request().GetAsync())抛出异常:

ServiceException: Code: BadRequest Message: Tenant does not have a SPO license

我的理解是 SPO 表示 SharePoint Online,这表明此请求需要企业许可证。但是,我已经通过 Graph Explorer 确认这应该是可能的。

我确实尝试了其他身份验证选项 - 仅个人帐户和所有帐户 - 但在这两种情况下我都收到了不同的错误:

"'xxxxxxxxxxx'(AppName) is configured for use by Microsoft Account users only. Please use the /consumers endpoint to serve this request"

我没有在网上找到任何解释这个问题的帮助,所以请寻求建议。

好吧,我来解释一下你的疑惑

首先,你误解了我在评论中所说的内容。我只是问您是否在创建应用程序时将支持帐户类型设置为:Personal Microsoft accounts only。我只是请你验证,而不是建议你这样做。因为这可能是错误的原因:'xxxxxxxxxxx'(AppName) is configured for use by Microsoft Account users only. Please use the /consumers endpoint to serve this request.

根据documentation/tenant id/contoso.onmicrosoft.com 端点仅允许具有特定 Azure AD 租户的 work/school 帐户的用户登录到应用程序。不支持个人账户。

只有 /common/consumers 端点将允许个人 Microsoft 帐户登录到应用程序。因为只有使用个人账号才能得到正确的响应,所以只需要使用/common端点登录即可。