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
我正在尝试使用 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