WebTokenRequest 和 OneDriveClient

WebTokenRequest and OneDriveClient

我正在尝试使用 Connect to identity providers with Web Account Manager

实现 Onedrive 客户端登录

通过这种方法,我终于得到了使用此代码的令牌

private static async Task<string> RequestTokenAndSaveAccount(WebAccountProvider Provider, String Scope, String ClientID)
    {
        try
        {
            WebTokenRequest webTokenRequest = new WebTokenRequest(Provider, "wl.signin onedrive.appfolder onedrive.readwrite", ClientID);

            WebTokenRequestResult webTokenRequestResult = await WebAuthenticationCoreManager.RequestTokenAsync(webTokenRequest);

            if (webTokenRequestResult.ResponseStatus == WebTokenRequestStatus.Success)
            {
                App.settings.onedriveStoredAccountKey = webTokenRequestResult.ResponseData[0].WebAccount.Id;

                return webTokenRequestResult.ResponseData[0].Token;
            }

            return "";
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.ToString());

            return "";
        }
    }

但我无法使用返回的令牌创建 OnedriveClient,因为我需要一个 MsaAuthenticationProvider 来创建客户端,它会创建自己的令牌,忽略来自 WebTokenRequest 的令牌,并且它没有任何方法来取之前的令牌。

有一种方法可以创建 OneDriveClient 而无需转到 REST Onedrive API?

谢谢

编辑:

由于(目前)有两个主要版本的 OneDriveSDK 并且它们彼此不同,因此有两种方法可以实现。

OneDrive.SDK 1.x

正如@Brad 所说,需要一个 IAuthenticationProvider 来创建 OneDriveClient

我从 https://github.com/ginach/Simple-IAuthenticationProvider-sample-for-OneDrive-SDK 得到了解决方案。

我把SimpleAuthenticationProvider放到了我的代码中,然后像这样创建了客户端

var client = new OneDriveClient(
        new AppConfig(),
        /* credentialCache */ null,
        new Microsoft.OneDrive.Sdk.HttpProvider(),
        new ServiceInfoProvider(new SimpleAuthenticationProvider { CurrentAccountSession = new Microsoft.OneDrive.Sdk.AccountSession { accessToken = AccessToken } }),
         ClientType.Consumer);

    client.BaseUrl = "https://api.onedrive.com/v1.0";

    await client.AuthenticateAsync();

其中accessToken取自RequestTokenAndSaveAccount方法。

OneDrive.SDK 2.x

对于这种情况,@dabox给出的答案是正确的解决方案。

OneDriveClient 只需要一个 IAuthenticationProvider,这是一个非常简单的界面。您可以创建自己的并实施 AuthenticateRequestAsync 以便它调用您的 RequestTokenAndSaveAccount 然后将不记名令牌添加到请求中。

根据 Brad 的回答,您可以创建一个新的 AuthenticationProivder 实现包 Microsoft.Graph.Core 中的 IAuthenticationProivder 接口。 Microsoft.Graph.Core包中还有一个DelegateAuthenticationProvider,它为你提供了一个Delegate接口。示例如下:

OneDriveClient oneDriveClient = new OneDriveClient(
new DelegateAuthenticationProvider(
    async (requestMessage) =>
    {
        string accessToken = await GetAccessTokenSomeWhereAsync();

        // Append the access token to the request.
        requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
    }));
return oneDriveClient ;

根据 Microsoft Graph 的 asp.net 示例修改:https://github.com/microsoftgraph/aspnet-connect-sample/blob/master/Microsoft%20Graph%20SDK%20ASPNET%20Connect/Microsoft%20Graph%20SDK%20ASPNET%20Connect/Helpers/SDKHelper.cs#L18