另一个尝试围绕我长达一个月的问题提出一个不同的问题:
我正在尝试启动“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进行客户端流程(不使用检索到的令牌对App Services进行身份验证)。这让我疯狂了一个多月。我无法相信为了让2个微软产品协同工作,我已经跳了多少圈。如果有人能引导我走向解决方案,我将无法感激。
答案 0 :(得分:1)
这是一种解决方法,我建议您可以使用MSAL返回的访问令牌启用移动服务器自定义身份验证。
更多细节,您可以参考以下步骤:
首先,您可以创建一个登录页面,该页面将使用Microsoft登录Microsoft Office帐户。它将返回访问令牌。
然后,您可以将带有访问令牌的请求发送到移动服务后端,以请求身份验证。
注意:用于检查访问令牌的后端逻辑是正确的,您需要自己实现。您可以解码访问jwt令牌以获取aud值。如果此值与客户端ID相同,则表示用户有权访问移动后端数据。
然后你可以使用jwt令牌从图形api获取用户信息。获取用户信息后,您可以将用户信息值设置为声明以生成身份验证令牌(使用此方法AppServiceLoginHandler.CreateToken [添加Microsoft.Azure.Mobile.Server.Login NuGet包])。通过使用此令牌,移动客户端用户可以访问移动后端。
访问令牌如下:
更多详细信息,您可以参考此article了解如何在移动后端启用自定义身份验证。