API OneDrive зависает при инициализации, но работает нормально через браузер

У нас есть эта интеграция с OneDrive для бизнеса, которая позволяет пользователям просматривать свои файлы и прикреплять их, но для этого одного пользователя в клиенте мы всегда получаем следующую ошибку при попытке вызвать API: "Запрашиваемый ресурс автоматически выделяется. Пожалуйста, попробуйте еще раз через несколько минут. Что совершенно нормально, если пользователь новый, но этот конкретный пользователь получал одно и то же сообщение об ошибке в течение более 2 недель. Доступ к onedrive из браузера работает нормально, и на диске есть и папки, и файлы, поэтому кажется, что пользователь оказался в этом странном состоянии.

Не совсем уверен, как ее решить, и я не думаю, что это проблема в том, как мы называем API, так как он отлично работает для любого другого пользователя в том же арендаторе. Хотя в итоге я написал минимальный объем кода, который мы все равно используем для доступа к onedrive, я могу убедиться, что у меня по-прежнему возникает та же ошибка:

class Program
{
    static void Main(string[] args)
    {
        var token = "...";
        var user = "...";
        var client = new OneDriveClient(new AppConfig
        {
            ActiveDirectoryAppId = "...",
            ActiveDirectoryClientSecret = "...",
            ActiveDirectoryReturnUrl = "...",
            ActiveDirectoryServiceEndpointUrl = "https://<REDACTED>-my.sharepoint.com/_api/v2.0",
            ActiveDirectoryServiceResource = "https://<REDACTED>-my.sharepoint.com"
        }, new AdalCredentialCache(), new HttpProvider(), new TestServiceInfoProvider(token, user), ClientType.Business);

        client.AuthenticateAsync().Wait();

        var result = client.Drive.Root.Children.Request().GetAsync().Result;
    }

    class TestServiceInfoProvider : ServiceInfoProvider
    {
        private readonly string _token;
        private readonly string _userName;

        public TestServiceInfoProvider(string token, string userName)
        {
            _token = token;
            _userName = userName;
        }

        public override async Task<ServiceInfo> GetServiceInfo(AppConfig appConfig, CredentialCache credentialCache, IHttpProvider httpProvider, ClientType clientType)
        {
            var serviceInfo = await base.GetServiceInfo(appConfig, credentialCache, httpProvider, clientType).ConfigureAwait(false);

            serviceInfo.BaseUrl = appConfig.ActiveDirectoryServiceEndpointUrl;
            serviceInfo.ServiceResource = appConfig.ActiveDirectoryServiceResource;

            if (serviceInfo.AuthenticationProvider == null)
                serviceInfo.AuthenticationProvider = new TestAuthenticationProvider(serviceInfo, _token, _userName);

            return serviceInfo;
        }
    }

    class TestAuthenticationProvider : IAuthenticationProvider
    {
        private readonly ServiceInfo _serviceInfo;
        private readonly string _token;
        private readonly string _userName;

        public TestAuthenticationProvider(ServiceInfo serviceInfo, string token, string userName)
        {
            _serviceInfo = serviceInfo;
            _token = token;
            _userName = userName;
        }

        public async Task AppendAuthHeaderAsync(HttpRequestMessage request)
        {
            if (CurrentAccountSession == null)
                await AuthenticateAsync().ConfigureAwait(false);

            if (!string.IsNullOrEmpty(CurrentAccountSession?.AccessToken))
                request.Headers.Authorization = new AuthenticationHeaderValue(Constants.Headers.Bearer, CurrentAccountSession.AccessToken);
        }

        public Task<AccountSession> AuthenticateAsync()
        {
            if (CurrentAccountSession != null && !CurrentAccountSession.IsExpiring())
                return Task.FromResult(CurrentAccountSession);

            CurrentAccountSession = new AccountSession
            {
                AccessToken = _token,
                AccessTokenType = Constants.Headers.Bearer,
                AccountType = AccountType.ActiveDirectory,
                CanSignOut = false,
                ClientId = _serviceInfo.AppId,
                ExpiresOnUtc = DateTimeOffset.MaxValue,
                UserId = _userName
            };

            return Task.FromResult(CurrentAccountSession);
        }

        public Task SignOutAsync() => null;

        public AccountSession CurrentAccountSession { get; set; }
    }
}

Использование Microsoft.OneDriveSDK версии 1.1.47.

0 ответов

Другие вопросы по тегам