我正在使用Azure上托管的ASP.NET Core 2.0应用程序,并使用MSAL通过Microsoft对用户进行身份验证.我通过身份验证过程获取基本信息,如名称,用户名和组声明.但是,我想通过MS Graph访问一些其他信息,例如用户个人资料照片.初始身份验证和令牌获取平稳运行,并向https://graph.microsoft.com/beta/me
返回发送请求200 OK
.https://graph.microsoft.com/beta/me/photo/$value
然而,当试图打电话时,我得到一个401 - Unauthorized
回报.
我在这个问题上看到了其他几篇文章,但大多数人都认为开发人员忘记要求正确的同意,从错误的端点获取令牌或类似的问题.所有这些我都证实不是这样的.
我已经确认使用https://jwt.ms/在令牌中包含了适当的范围.我也尝试过要求更大的范围.目前我正在使用以下范围:openid profile User.ReadBasic.All User.Read.All User.ReadWrite Files.ReadWrite.All
.根据获取用户的beta参考,最少需要的权限是,User.Read
并根据获取照片的参考,最少需要的权限也是User.Read
.使用Graph Explorer我还确认我应该使用我的权限访问该照片,但是,我没有在我的个人资料上设置任何图片,因此它给了我一个404
回复.
我不知道为什么我无法访问个人资料照片,所以任何建议都非常感谢.如果您需要更多信息或详细信息,请告诉我们.如果相关,我有一个自定义中间件来处理读取用户信息的后验证过程,这也会对照片的MS Graph进行额外调用.
我也试过https://graph.microsoft.com/beta/users/{my-user-id}/photo/$value
产生相同的结果 - 图形浏览器中的404和我的代码中的401
这是我正在使用的代码.第一个代码段位于中间件中,该中间件将来自经过身份验证的用户的声明置于特定格式.我刚刚在返回时设置了一个断点并检查了响应对象.
public async Task GetUserPhotoAsync(string userid, HttpContext context)
{
HttpClient client = new HttpClient();
//client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var result = await new TokenHelper(_settings).GetAuthenticationAsync(userid, context, new string[] { "User.ReadBasic.All", "User.Read.All", "User.ReadWrite", "Files.ReadWrite.All" });
var …
Run Code Online (Sandbox Code Playgroud)