Как получить токен доступа для Microsoft Graph для вошедшего в систему пользователя? - PullRequest
0 голосов
/ 10 мая 2018

Я работаю над веб-приложением .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."
            });
        }
    }
}
...