B2B用户无法使用v2.0端点和MSAL Auth流登录租户

问题描述 投票:3回答:2

我正在尝试创建一个B2B管理门户。我开始使用this样本,因为它使用了MSAL和Graph API。

[email protected]在租户中。它被邀请作为“访客用户”,即B2B用户。但是,即使已将其添加到租户,使用[email protected]登录也不起作用。登录后出现以下错误:

AADSTS50020:api版本'2.0'不支持来自外部身份提供商'live.com'的用户帐户'[email protected]'。租户独立端点不支持Microsoft帐户pass-thru用户和来宾。跟踪ID:2ad8bee0-d00a-4896-9907-b5271a113300相关ID:0ea84617-4aa1-4830-859f-6f418252765e时间戳:2017-10-03 15:35:22Z

我改变了权限(从普通版本)到仅允许来自我的租户的用户(要求):https://login.microsoftonline.com/tenant.onmicrosoft.com/v2.0

在使用MSAL时,客人不算作我租客的一部分吗?这意味着我必须使用“旧”技术,即ADAL和AAD Graph,这是不推荐的,并且感觉有点蹩脚。

azure azure-active-directory microsoft-graph msal
2个回答
1
投票

如果您在权限中传递特定的租户值,那么

只有具有特定Azure AD租户的工作或学校帐户的用户才能登录该应用程序。可以使用Azure AD租户的友好域名或租户的GUID标识符。

这意味着此方案不支持Microsoft帐户。请参阅here以获取Microsoft帐户和工作或学校帐户。在这种情况下,如果您从其他租户中新建用户用户,它也应该有效。

您可以从以下链接中查看租户文档:

Fetch the OpenID Connect metadata document


1
投票

我知道这是一个老线程,但万一有人偶然发现它,这是一个解决方案:在个人客户帐户的情况下,使用凭证授予流量(Get access without a user)。为此,您首先需要为您要代表签名用户使用的API授予(类型应用程序)适当的权限。这将允许您使用应用程序的标识本身而不是登录用户获取访问令牌。接下来获取这样的标记(在此示例中,我将获得Graph API的访问令牌):

public async Task<string> GetAccessToken()
{
    using (HttpClient httpClient = new HttpClient())
    {
        string token = "";
        try
        {
            httpClient.BaseAddress = new Uri($"https://login.microsoftonline.com/{tenantId}");
            httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
            HttpRequestMessage request = new HttpRequestMessage();
            List<KeyValuePair<string, string>> body = new List<KeyValuePair<string, string>>
            {
               new KeyValuePair<string, string>("client_id", clientId),
               new KeyValuePair<string, string>("scope", "https://graph.microsoft.com/.default"),
               new KeyValuePair<string, string>("client_secret", appSecret),
               new KeyValuePair<string, string>("grant_type", "client_credentials")
            };
            request.Method = HttpMethod.Post;
            request.RequestUri = new Uri($"{httpClient.BaseAddress}/oauth2/v2.0/token");
            request.Content = new FormUrlEncodedContent(body);
            var response = await httpClient.SendAsync(request);
            var content = await response.Content.ReadAsAsync<dynamic>();
            token = content.access_token;
        }
        catch (Exception e)
        {
        }
        return token;
    }
}

提示:如果您的目标也是图谱API,请不要尝试在这种情况下使用/ me端点登录用户信息。由于令牌是使用应用程序标识而不是使用登录用户生成的,因此/ me将是应用程序而非登录用户。您要做的是:从Claim(类型:http://schemas.microsoft.com/identity/claims/objectidentifier)检索登录的用户ID并使用/ user / {userid}端点。

© www.soinside.com 2019 - 2024. All rights reserved.