代表 Azure 移动后端 - MS Graph

On-Behalf-Of Azure Mobile backend - MS Graph

又一次尝试围绕我长达一个月的问题提出不同的问题:

我现在正在尝试启动 "On-Behalf-Of" 流程以在用户使用 Microsoft 帐户登录时获取 MS Graph 令牌。如此处所述: https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-protocols-oauth-on-behalf-of

在客户端,用户使用服务器流程登录:

var user = await MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount);

在 .NET 后端,我正在尝试检索 MS Graph 令牌:

string clientId = "id-shown-in-app-registration-portal";
string clientSecret = "secret-shown-in-app-registration-portal";
IEnumerable<string> msIdTokenOut = null;
Request.Headers.TryGetValues("x-ms-token-microsoftaccount-access-token", out msIdTokenOut);
string msIdToken = msIdTokenOut.FirstOrDefault();
AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/common/oauth2/v2.0");
UserAssertion assertion = new UserAssertion(msIdToken);
ClientCredential cred = new ClientCredential(clientId, clientSecret);
AuthenticationResult authResult = await authContext.AcquireTokenAsync("https://graph.microsoft.com/", cred, assertion);

我收到以下错误: aadsts50027:无效的 jwt 令牌。令牌格式无效。

我已经尝试了所有可能的组合,从使用服务器流登录,使用 MSAL 进行客户端流(不使用检索到的令牌对应用服务进行身份验证)。这让我发疯了一个多月。我不敢相信为了让 2 个 Microsoft 产品协同工作,我经历了多少困难。如果有人可以引导我找到解决方案,我将不胜感激。

这是一个解决方法,我建议您可以使用 MSAL returned 访问令牌启用移动服务器自定义身份验证。

更多详情,您可以参考以下步骤:

首先,您可以创建一个登录页面,使用 MSAL 登录 Microsoft 帐户。它将 return 访问令牌。

然后您可以将带有访问令牌的请求发送到移动服务后端以请求身份验证。

注意:后台检查access token的逻辑是正确的,需要自己实现。您可以解码访问 jwt 令牌以获取 aud 值。如果此值与客户端 ID 相同,则表示用户具有访问移动后端数据的权限。

然后你可以使用 jwt 令牌从图 api 中获取用户信息。获取用户信息后,您可以将用户信息值设置为claims以生成auth token(使用此方法AppServiceLoginHandler.CreateToken[添加Microsoft.Azure.Mobile.Server.Login NuGet包])。通过使用此令牌,移动客户端用户可以访问移动后端。

这样的访问令牌:

更多详细信息,您可以参考此article以了解如何在移动后端启用自定义身份验证。