Я работаю над веб-приложением .net Core 2 с внешним интерфейсом Angular 5, используя Azure AD для аутентификации.
Мы основали нашу реализацию Graph на примере подключения aspnetcore.https://github.com/microsoftgraph/aspnetcore-connect-sample
У нас есть две реализации их метода GetUserAccessTokenAsync в GraphAuthProvider.cs
https://github.com/microsoftgraph/aspnetcore-connect-sample/blob/master/MicrosoftGraphAspNetCoreConnectSample/Helpers/GraphAuthProvider.cs
Мы можем получить токен для приложения, см. Нижефрагмент, но приведенный ниже для получения токена для вошедшего в систему пользователя вызывает исключение ServiceException.
Очевидно, что массив Users в переменной cca не содержит пользователей, но мы не можем понять, почему.Существуют ли примеры использования Microsoft Graph в бэкэнде веб-API, вызываемом из углового интерфейса?
Из-за дополнительной обработки на стороне сервера нам нужны вызовы для прохождения через веб-API, поэтому мы не можем напрямую обращаться к Graph дляthis.
Получает токен доступа к графику от имени вошедшего в систему пользователя
public async Task<string> GetUserAccessTokenAsync(string userId)
{
_userTokenCache = new SessionTokenCache(userId, _memoryCache).GetCacheInstance();
var cca = new ConfidentialClientApplication(
_clientId,
_redirectUri,
_credential,
_userTokenCache,
null);
if (!cca.Users.Any()) throw new ServiceException(new Error
{
Code = "TokenNotFound",
Message = "User not found in token cache. Maybe the server was restarted."
});
try
{
var result = await cca.AcquireTokenSilentAsync(_scopes, cca.Users.First());
return result.AccessToken;
}
// Unable to retrieve the access token silently.
catch (Exception)
{
throw new ServiceException(new Error
{
Code = GraphErrorCode.AuthenticationFailure.ToString(),
Message = "Caller needs to authenticate. Unable to retrieve the access token silently."
});
}
}
Получает токен доступа к графику приложения
public async Task<string> GetClientAccessTokenAsync()
{
_appTokenCache = new SessionTokenCache(_clientId, _memoryCache).GetCacheInstance();
var cca = new ConfidentialClientApplication(
_clientId,
_clientAuthority,
_redirectUri,
_credential,
null,
_appTokenCache);
try
{
var result = await cca.AcquireTokenForClientAsync(_appScopes);
return result.AccessToken;
}
catch (Exception)
{
throw new ServiceException(new Error
{
Code = GraphErrorCode.AuthenticationFailure.ToString(),
Message = "Unable to authenticate. Unable to retrieve the access token for client."
});
}
}
}