我有一个网站,我有用户登录Azure AD,然后我试图获得用户所属的所有Microsoft团队的列表。我正在使用GraphServiceClient,它似乎没有测试版的东西,但我想我已经解决了这个问题,看下面的例子,如果有更好的方法让我知道。列出所有加入团队
首先,当我创建GraphServiceClient时,我将beta端点提供给像这样的构造函数。
public GraphServiceClient GetAuthenticatedClient(string userId) {
_graphClient = new GraphServiceClient("https://graph.microsoft.com/beta", new DelegateAuthenticationProvider(
async(requestMessage) => {
// Passing tenant ID to the sample auth provider to use as a cache key
AccessToken = await _authProvider.GetUserAccessTokenAsync(userId);
// Append the access token to the request
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);
}));
return _graphClient;
}
您还会注意到,我存储的accessToken因为我需要后来,这就是为什么我的问题,如果有更好的方式来处理这个问题。
然后在我试图获得加入团队名单的方法中,我正在执行以下操作。
public static async Task < IEnumerable <string>> GetGroups(GraphServiceClient graphClient) {
var request = graphClient.Me.Request().GetHttpRequestMessage();
request.RequestUri = new Uri(request.RequestUri.AbsoluteUri + "/joinedTeams");
//request.RequestUri = new Uri("https://graph.microsoft.com/beta/groups");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", GraphSDKHelper.AccessToken);
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
try {
var response = await graphClient.HttpProvider.SendAsync(request);
var stream = await response.Content.ReadAsStreamAsync();
} catch (Exception e) {}
//var gs = await graphClient.Me.MemberOf.Request().GetHttpRequestMessage();//.GetAsync();
var results = new List <string>();
var groups = await graphClient.Groups.Request().GetAsync();
do {
foreach(var group in groups) {
results.Add(group.DisplayName);
}
groups = await groups.NextPageRequest.GetAsync();
} while (groups.NextPageRequest != null);
return results;
}
您可以看到有2个零件。我尝试使用加入的团队调用的第一部分,但是这给我以下错误。然后我列出所有的组,并且一个工作正常。
Message: Authorization has been denied for this request.
Inner error
在portal.azure.com我有应用注册设置,并给予user.read.all应用程序的权限
也user.read.all下委托权限(不确定我需要给它)。
那么,为什么这不工作,如果有,我不是正确地做其他的事情,请让我知道。
经过一些更多的测试后,还有一个附注。问题真的是我。每当我和我打电话,即我/驱动器等错误。我可以打电话给用户[XXXXX] /驱动器,这工作正常,但我下面的任何失败。
编辑
他是创建GraphServiceClient
,这基于以下马克的答案可能是我不能够访问me
问题的原因代码:
public GraphServiceClient GetAuthenticatedClient(string userId)
{
_graphClient = new GraphServiceClient("https://graph.microsoft.com/beta", new DelegateAuthenticationProvider(
async(requestMessage) =>
{
// Passing tenant ID to the sample auth provider to use as a cache key
AccessToken = await _authProvider.GetUserAccessTokenAsync(userId);
// Append the access token to the request
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);
}));
return _graphClient;
}
public async Task<string> GetUserAccessTokenAsync(string userId)
{
TokenCache userTokenCache = new SessionTokenCache(userId, _memoryCache).GetCacheInstance();
try
{
AuthenticationContext authContext = new AuthenticationContext(_aadInstance, userTokenCache);
ClientCredential credential = new ClientCredential(_appId, _appSecret);
AuthenticationResult result = await authContext.AcquireTokenAsync(_graphResourceId, credential);
return result.AccessToken;
}
catch (Exception ex)
{
return null;
}
}
用户通过Azure AD登录到应用程序。那么,我需要做些什么才能使委托权限摆脱位置。我已经为应用程序注册进行了检查。 –
我编辑了我的问题以显示我在创建GraphServiceClient时使用的所有代码。 –