gpt4 book ai didi

c# - 在 c# 控制台项目中使用 OneDrive SDK 进行身份验证

转载 作者:行者123 更新时间:2023-11-30 12:56:09 25 4
gpt4 key购买 nike

我正在尝试创建一个程序来从 OneDrive 下载我所有的 OneNote 文件。但是,当我尝试使用 msaAuthenticationProvider 进行身份验证时,会出现一个白色窗口,然后什么也没有发生。我认为该窗口应该是 Microsoft 登录,但其中什么也没有出现。

这是我的代码:

string[] scopes = new string[] {
"onedrive.readonly",
"wl.signin"
};
var msaAuthenticationProvider = new MsaAuthenticationProvider(
clientId,
returnURL,
scopes);

await msaAuthenticationProvider.AuthenticateUserAsync();
var client = new OneDriveClient(URL, msaAuthenticationProvider);

它到达 AuthenticateUserAsync 方法,然后是窗口应用程序,之后什么也没有发生。我也不确定 returnURL 应该是什么,因为所有示例都针对应用程序版本或只是说返回 URL 而没有给出任何示例。

最佳答案

抱歉耽搁了。你试过这个方法吗:

msaAuthenticationProvider.RestoreMostRecentFromCacheOrAuthenticateUserAsync();

编辑:如果最后一个已知的连接 token 可用,则此方法可用于在不提示的情况下对用户进行身份验证。因此,如果可以或提示用户提供他的登录名和密码,这将恢复最后的身份验证缓存。这可以替换已经使用的 AuthenticateUserAsync 方法。我遇到了同样的问题,这个方法解决了它。

编辑 2:OneDrive SDK 文档非常糟糕,我自己发现了这一点,因为我发现您可以获得连接 token (例如保存它)并在需要时将其注入(inject)异步任务中:

        if (_OneDriveCacheBlob == null)
{
bool needtosaveblob = true;
_OneDriveCacheBlob = null;
CredentialCache cc = new CredentialCache();
_OneDriveCacheBlob = GetUser(CurrentUserName).OneDriveAuthProviderBlob;

if (_OneDriveCacheBlob != null)
{
cc.InitializeCacheFromBlob(_OneDriveCacheBlob);
needtosaveblob = false;
}
MsaAuthenticationProvider msaAuthProvider = new MsaAuthenticationProvider(OneDriveClass.clientId, OneDriveClass.returnUrl, scopes, cc);

int timeout = 15;
_ = Task.Run(() => WaitForODConnection(msaAuthProvider));
while (!WaitForODConnectionExecuted)
{
if (timeout <= 0)
break;

await Task.Delay(TimeSpan.FromSeconds(1));
timeout -= 1;
}
WaitForODConnectionExecuted = false;

if (timeout <= 0)
{
// Request for reconnection to OneDrive because of invalid Blob
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
{
//This method requests a new login by a simple msaAuthProvider.AuthenticateUserAsync() call from a new instance of MsaAuthenticationProvider and a new instance of CredentialCache.
//ChangeOneDriveAccount();
});
}
else
{
_OneDriveClient = new OneDriveClient(OneDriveClass.basUrl, msaAuthProvider);
}

string accessToken = msaAuthProvider.CurrentAccountSession.AccessToken;
JObject json = await GetUserInfos(msaAuthProvider.CurrentAccountSession.AccessToken);
if (json != null)
{
// If you need
oneDriveUserName = json["name"].ToString();
oneDriveEmail = json["emails"]["account"].ToString();
}
else
{
//Unable to get OneDrive user informations;
}

if (needtosaveblob)
{
_OneDriveCacheBlob = cc.GetCacheBlob();
//You can save _OneDriveCacheBlob to reuse it later;
}
}

获取用户信息:

/// <summary>
/// Return User informations as a JObject. To get username and email, if return isn't null :
/// username = json["name"].ToString();
/// email = json["emails"]["account"].ToString();
/// </summary>
/// <param name="accessToken">accesstoken of Onedrive account</param>
/// <returns>JObject value</returns>
public static async Task<JObject> GetUserInfos(string accessToken)
{
JObject json = null;
Uri uri = new Uri($"https://apis.live.net/v5.0/me?access_token={accessToken}");

System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient();
System.Net.Http.HttpResponseMessage result = await httpClient.GetAsync(uri);
//user info returnd as JSON
string jsonUserInfo = await result.Content.ReadAsStringAsync();
if (jsonUserInfo != null)
{
json = JObject.Parse(jsonUserInfo);
//username = json["name"].ToString();
//email = json["emails"]["account"].ToString();
}
return json;
}

并且因为如果 token 不再可用,OneDrive 方法永远不会过期:

    bool WaitForODConnectionExecuted = false;
private async Task WaitForODConnection(MsaAuthenticationProvider msaAuthProvider)
{
await msaAuthProvider.RestoreMostRecentFromCacheOrAuthenticateUserAsync();
WaitForODConnectionExecuted = true;
}

这并不好笑,我认为我的代码不干净,所以不要在没有做任何工作的情况下按原样使用它。

关于c# - 在 c# 控制台项目中使用 OneDrive SDK 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43229436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com