gpt4 book ai didi

asp.net - Microsoft Graph API .NET - 能够拉取所有用户(包括我自己),但不仅仅是我

转载 作者:行者123 更新时间:2023-12-02 11:38:04 25 4
gpt4 key购买 nike

我重新打开了这个问题。请在底部查看我的编辑。

使用 VS 2017 模板 ASP.NET MVC Web App using Work/School Account Authentication 项目

我收到此错误:

The token for accessing the Graph API has expired. Click here to sign-in and get a new access token.



当我试图提取关于我自己的基本信息时,当我提取我的信息以及我的 AD 中的其他人时,我没有任何问题。

UserProfileController.cs:(函数定义)
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;
using System.Threading.Tasks;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.OpenIdConnect;
using MY_PROJECT.Utilities;
using Microsoft.Graph;

namespace MY_PROJECT.Controllers
{
[Authorize]
public class UserProfileController : Controller
{
/// <summary>
/// Get the signed-in user
/// </summary>
/// <returns>A single User</returns>
public async Task<User> GetMe()
{
GraphServiceClient graphClient = new GraphServiceClient(new AzureAuthenticationProvider());

return await graphClient.Me.Request().GetAsync();
}

/// <summary>
/// Get all users in the organization
/// </summary>
/// <returns>A list of Users</returns>
public async Task<List<User>> GetAllUsers()
{
List<User> userResult = new List<User>();

GraphServiceClient graphClient = new GraphServiceClient(new AzureAuthenticationProvider());
IGraphServiceUsersCollectionPage users = await graphClient.Users.Request().Top(500).GetAsync(); // Hard coded to pull 500 users
userResult.AddRange(users);

// Users are returned as pages; keep pulling pages until we run out of them
while (users.NextPageRequest != null)
{
users = await users.NextPageRequest.GetAsync();
userResult.AddRange(users);
}

return userResult;
}

public async Task<ActionResult> Index()
{
try
{
// Get the signed-in user's profile
User me = await GetMe();

return View(me);
}
catch (AdalException)
{
// Return to error page.
return View("Error");
}
// if the above failed, the user needs to explicitly re-authenticate for the app to obtain the required token
catch (Exception)
{
return View("Relogin");
}
}

[Authorize(Roles = "Admin")]
public async Task<ActionResult> Admin()
{
try
{
var user = await GetAllUsers();

return View(user);
}
catch (AdalException)
{
// Return to error page.
return View("Error");
}
// if the above failed, the user needs to explicitly re-authenticate for the app to obtain the required token
catch (Exception)
{
return View("Relogin");
}
}

public void RefreshSession()
{
HttpContext.GetOwinContext().Authentication.Challenge(
new AuthenticationProperties { RedirectUri = "/UserProfile" },
OpenIdConnectAuthenticationDefaults.AuthenticationType);
}
}
}

AzureAuthenticationProvider.cs (处理 MS Graph API 连接)
using System.Configuration;
using System.Net.Http;
using System.Security.Claims;
using System.Threading.Tasks;
using MY_PROJECT.Models;
using Microsoft.Graph;
using Microsoft.IdentityModel.Clients.ActiveDirectory;

namespace MY_PROJECT.Utilities
{
class AzureAuthenticationProvider : IAuthenticationProvider
{
private string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
private string appKey = ConfigurationManager.AppSettings["ida:ClientSecret"];
private string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];

public async Task AuthenticateRequestAsync(HttpRequestMessage request)
{
string signedInUserID = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
string tenantID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;

// get a token for the Graph without triggering any user interaction (from the cache, via multi-resource refresh token, etc)
ClientCredential creds = new ClientCredential(clientId, appKey);
// initialize AuthenticationContext with the token cache of the currently signed in user, as kept in the app's database
AuthenticationContext authenticationContext = new AuthenticationContext(aadInstance + tenantID, new ADALTokenCache(signedInUserID));
AuthenticationResult authResult = await authenticationContext.AcquireTokenAsync("https://graph.microsoft.com/", creds);

request.Headers.Add("Authorization", "Bearer " + authResult.AccessToken);
}
}
}

Admin.cshtml (所有用户最终所在的位置)
@using Microsoft.Ajax.Utilities
@using Microsoft.Graph
@model List<User>

@{
ViewBag.Title = "Admin";
}
<h2>@ViewBag.Title.</h2>

<div class="input-group">
// search text box
</div>

<table id="userTable" class="table table-bordered table-responsive">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
</tr>
</thead>
@foreach (var user in Model
.Where(u => !u.Surname.IsNullOrWhiteSpace()))
{
<tr>
<td>@user.DisplayName</td>
<td>@user.Mail</td>
</tr>
}
</table>

<script>
// search function
</script>

这是管理员的照片,显示我可以获得我的基本信息: Admin page

Index.cshtml (只有登录用户的信息应该在那里,但得到错误)
@model Microsoft.Graph.User

@{
ViewBag.Title = "User Profile";
}
<h2>@ViewBag.Title.</h2>

<table class="table table-bordered table-striped">
<tr>
<td>Display Name</td>
<td>@Model.DisplayName</td>
</tr>
<tr>
<td>First Name</td>
<td>@Model.GivenName</td>
</tr>
<tr>
<td>Last Name</td>
<td>@Model.Surname</td>
</tr>
<tr>
<td>Job Title</td>
<td>@Model.JobTitle</td>
</tr>
</table>

这是我进入索引页面的错误: Redirect from Index to UserProfile Graph Api Token Error

以下是 Azure 门户中唯一的应用权限:

App Permissions

所以我的 GetAllUsers() 函数工作正常,但我的 GetMe() 函数却没有,我不知道为什么,因为它是非常相似的代码。

任何帮助或想法?

编辑:重新打开问题

TL;DR: I'm still stuck, please help (preferably with ASP.NET code examples)



大约一周前,我接受了这个问题的答案,此后一直在尽最大努力弄清楚如何在我的程序中实现或转换为“授权代码流”,简单地说:我还没有弄清楚如何实现。
我仍然需要这方面的帮助。所以我现在删除已回答的复选标记。

因此,与其重新发布基本相同的问题,不如重新打开这个问题并添加进去。

我想让我的应用程序做什么:(所以我们可以知道我的目标是什么,希望以此为基础鼓励更多的建议。我想强调的是,我不是要你为我编写我的程序,我只是想要我们在同一页面上。如果你想展示如何,我很乐意看到它!很多这对我来说都是新的。)
  • 让用户使用链接到我租户的 AAD 的 AAD 凭据登录,因为这仅适用于员工(目前似乎正在工作)
  • 能够从 AAD 中提取登录用户的基本信息(这篇文章的最初原因,仍然不能不使用 Microsoft.IdentityModel.Clients.ActiveDirectory aka ADAL)
  • 能够提取 AAD 中所有用户的基本信息(目前可以使用 MS Graph)
  • 根据与 Web 应用程序关联的 Azure list 确定用户具有的角色(到目前为止,我似乎也在使用 ADAL 执行此操作)
  • 根据用户分配的 list 角色,使用 [Authorize(Roles = "Admin")] 类型标签限制对某些页面/内容的访问(混合使用 ADAL 和 System.Security.Claims )
  • 能够将 AAD 用户分配给应用程序的组,然后分配 list 定义的角色(还没有达到这个程度)

  • 我仍然坚持的内容:
  • 我还在努力理解如何在.NET环境中执行Authorization Code Flow,使用Microsoft Graph API和Azure AD,所以我可以执行这两个Microsoft Graph Calls,主要是最底层的一个:
  • graphServiceClient.Users.Request().Top(500).GetAsync(); graphServiceClient.Me.Request().GetAsync();
  • 很多在线使用 Microsoft Graph 和 AAD 的示例使用 Implicit Flow 这不是我想要的,或者它们最终解释了 token 如何来回移动,几乎没有代码示例。
  • 我可以使用 ADAL 进行身份验证流程吗?因为我的应用程序只有 Azure AD 帐户使用它,所以我可能应该坚持使用 ADAL,直到 MSAL 更加充实。

  • 我从头开始很好,我只是想学习如何做到这一点。

    次要更新:

    在 Nan Yu 的帮助下,当我切换到 Easy Auth 进行身份验证时,我能够按照我想要的方式使用 Microsoft.Graph graphServiceClient
    在这里查看我的另一篇文章: Can I use the Microsoft Graph SDK with Azure AD Easy Auth
    请务必阅读顶部链接的 article by cgillum,该文件详细介绍了 Azure 门户/资源网站中的一些所需设置。

    最佳答案

    您正在使用 Client Credential 流,它仅对您的应用进行身份验证。如果没有用户身份验证,上下文中就没有 me 来检索数据。如果您希望使用 me,则需要切换到 Authorization Code 流程。

    更新:

    您想使用 Microsoft Authentication Library (MSAL) ,它是最新的库。

    除非您需要仅在 v1 中支持的特定功能,否则我通常建议使用 Azure AD v2 endpointMicrosoft Graph API 的大部分文档和示例都假设您正在使用此端点。

    隐式流程与授权代码流程几乎相同,但有一些限制。例如,您无法刷新使用隐式流检索的 token ,因此当您的 token 过期(约 1 小时)时,用户将需要重新进行身份验证。通常,您仅在没有其他选项(例如需要使用客户端 javascript 进行身份验证的单页应用程序)时才使用隐式流。

    我有一些文章讨论了 v2 Endpoint Flows 如何工作,可能会提供一些背景信息:

  • Microsoft v2 Endpoint Primer
  • v2 Endpoint and Implicit Grant
  • v2 Endpoint and Admin Consent

  • 如果您使用的是 ASP.NET,那么这些是利用 MDAL 和使用 ASP.NET 和 Microsoft Graph .NET Client Library 的 v2 端点的示例:
  • microsoftgraph/aspnet-snippets-sample
  • microsoftgraph/aspnet-connect-sample
  • 关于asp.net - Microsoft Graph API .NET - 能够拉取所有用户(包括我自己),但不仅仅是我,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46064495/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com