我有一个网站,我有用户登录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;
}
你可以看到这有两个部分。第一部分我尝试使用已加入的团队调用,但这会给我以下错误。然后,我只是列出了所有组,并且一个工作正常。
Message: Authorization has been denied for this request.
Inner error
在portal.azure.com中,我有应用程序注册设置,并且已经给出了user.read.all应用程序权限
以及在委派权限下的user.read.all(不确定我需要提供它)。
那么为什么这不起作用,如果还有其他我没做错的事情请告诉我。
经过一些更多测试后再补充一点。这个问题真的是我。无论何时我打电话给我,即我/驱动器等,都会出错。我可以打电话给用户[XXXXX] /驱动器并且工作正常,但是我下面的任何东西都失败了。
被修改
他是创建GraphServiceClient
的代码,根据Marc的回答,可能导致我无法访问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;
}
}
答案 0 :(得分:0)
如果您正在使用应用程序权限(又名“客户端凭据流”),则无法使用/me/
调用任何方法。 /me/
路径要求在上下文中有用户。这仅在用户进行身份验证并且您正在使用委派权限(即“授权授予”或“隐式授权”流)时才会发生。
joinedTeams
方法尤其还有一个known issue,目前将其限制为me
用户,从而无法实现应用场景。
我建议使用Delegated范围转向授权授权流程,并要求用户进行身份验证。这将启用me
用户上下文,并允许您检索joinedTeams
。
至于存储令牌,这不是一个好的解决方案。代币相对较短。相反,您应该请求“离线访问”权限。这将启用refresh_token
,您可以根据需要存储和使用access_token
来检索新的vecsets
。