"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.read
和 files.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
端点登录即可。
我正在尝试了解如何配置 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.read
和 files.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
端点登录即可。