AzureAD b2c MSAL - 令牌响应缺少访问令牌

时间:2017-08-08 22:02:40

标签: swift azure-ad-b2c msal

尝试使用swift中Azure的活动目录b2c对用户进行身份验证时遇到问题。它出现我能够在webview中成功登录。 AD能够找到我的用户并在密码错误时返回错误,但在我登录后我被重定向到我的应用程序时出现以下错误:

无法获取令牌:错误域= MSALErrorDomainCode = -41205“null” Userinfo = {MSALErrorDescriptionKey =令牌响应缺少访问令牌}

let kSignupOrSigninPolicy = "b2c_1_signupandsignin" // Your signup and sign-in policy you created in the portal
let kScopes: [String] = [""]
let kEndpoint = "https://login.microsoftonline.com/tfp/%@/%@"
let kTenantName = "sampleapp.onmicrosoft.com" // Your tenant name




@IBAction func authorizationButton(_ sender: UIButton) {


    let kAuthority = String(format: kEndpoint, kTenantName, kSignupOrSigninPolicy)


    do {
        let application = try MSALPublicClientApplication.init(clientId: kClientID, authority: kAuthority)
        application.acquireToken(forScopes: kScopes) { (result, error) in
                if  error == nil {
                    self.accessToken = (result?.accessToken)!
                    self.loggingText.text = "Access token is \(self.accessToken)"
                    self.signoutButton.isEnabled = true;
                    self.callGraphApiButton.isEnabled = true;
                    self.editProfileButton.isEnabled = true;
                    self.refreshTokenButton.isEnabled = true;


                } else {
                    self.loggingText.text = "Could not acquire token: \(error ?? "No error informarion" as! Error)"
                }
        }
    } catch {
        self.loggingText.text = "Unable to create application \(error)"
    }
}

我怀疑后端的作用域配置是否有问题,我在前端列出了作用域。据我所知,我们在后端没有自定义范围配置。我为kScopes变量尝试了一些不同的字符串:

"openid"
""
"https://graph.windows.net/openid"
"https://graph.windows.com/openid"
"https://graph.microsoft.com/openid"

1 个答案:

答案 0 :(得分:2)

我们的公开MSALError class是其中一个有助于查看的地方。它通常有助于调试这些问题。

B2C目前不支持Microsoft Graph

您遇到的问题是您正在请求Microsoft的Graph API访问和范围。 尚未支持使用B2C租户访问Microsoft的图谱API。

B2C旨在为您提供一个访问令牌,您可以将其用于您自己的后端Web API,以及您希望传递给该服务的范围,以限制对该服务的访问。如果没有后端服务来访问,您将无法获得access_token。

这在Sample:

的文档中引用

let kGraphURI = "<Your backend API>" // This is your backend API that you've configured to accept your app's tokens let kScopes: [String] = ["<Your backend API>/demo.read"] // This is a scope that you've configured your backend API to look for.

如果你考虑它是有道理的 - B2C是企业对消费者。我们的用例是您希望使用您拥有并为您的消费者控制的身份系统。在这种情况下,您最有可能向客户提供您希望限制访问的实际服务(这是身份系统的重点)。即使他们使用Google或Facebook(我们的产品支持)登录也是如此,因为您之后想要告诉您的后端服务用户身份为他们创建帐户或让他们访问您的服务。< / p>

您获得的确切错误是您要求访问Microsoft Graph API,这是不可能的,因此无法获得同意。 B2C服务知道这一点并返回没有access_token的响应。我们的MSAL库向您报告这种情况,并且授权失败。

但我确实希望将Microsoft Graph API与我自己的身份系统一起使用!

这是一个有趣的用例,随着Microsoft Graph的增长,我们越来越多地将此视为一种问题。我们正努力加强B2C,以支持未来。请务必查看GitHub主页并发布说明以查看何时添加此内容。

如果您想允许用户仅使用Microsoft Graph API,您应该利用通用的MSAL SDK并使用https://apps.dev.microsoft.com加载应用程序。

但我想签一个人,根本不访问任何API!

您可能就是这种情况,因为您尝试访问Microsoft Graph但似乎无法使用它。

签署某人有两个部分:

OpenID Connect(身份验证) - 身份系统告诉您是,此用户存在于我们的系统中,就是这样。这通常通过向您发送id_token来表示。没有任何访问权限。如果您只是想在登上自己的身份系统之前检查用户是否合法,这可能很有用。

OAuth2(授权) - 您要求身份系统授予您对其控制的资源的访问权限。通过为您提供访问令牌,您可以通过此访问权限切换到资源。您需要向身份系统提供身份以查看用户是否应该有权访问该资源,但这不一定是使用OpenID Connect,它甚至可能不是人类! (比如使用服务到服务的连接,使用API​​密钥/客户端机密只是文本字符串)

大多数开发人员都使用OpenID Connect和OAuth2,因为他们想要签署某人然后访问资源。例如,Microsoft Graph API的正常流程就像这样。您希望用户登录(使用Microsoft帐户),然后访问Graph API(使用该Microsoft帐户)。

正如我所说,有时你只是希望身份系统说用户存在而且全部都是。

我们有一个流程,which is discussed here。简而言之,您希望将范围更改为&scope=openid%20offline_access,但您绝对应该阅读该文档并确保完全理解该方案。