У меня установлено условие, где, если есть кэшированный токен, он будет использовать его, иначе он будет искать переданные учетные данные или запрашивать учетные данные. Даже после однократного ввода моих учетных данных через AcquireTokenInteractive () и повторного запуска программы, она все равно запрашивает учетные данные. Если у меня есть только AcquireTokenSilent (), я получаю ошибку ссылки для переменной token
, потому что ей ничего не передается. Он либо не кэширует мой токен, либо неправильно извлекает мой кэшированный токен, но я также не уверен, как устранить неполадки. Согласно MSDocs https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-acquire-cache-tokens он должен выполнять кэширование автоматически.
В настоящее время я закомментировал AcquireTokenByUsernamePassword () для устранения неполадок.
static async Task<GraphServiceClient> Auth()
{
string[] scopes = new string[] { "user.read" };
string token = null;
IPublicClientApplication app;
app = PublicClientApplicationBuilder.Create(ConfigurationManager.AppSettings["clientId"])
.Build();
AuthenticationResult result = null;
var accounts = await app.GetAccountsAsync();
if (accounts.Any())
{
result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
.ExecuteAsync();
}
else
{
try
{
///var securePassword = new SecureString();
///foreach (char c in "dummy") // you should fetch the password
/// securePassword.AppendChar(c); // keystroke by keystroke
/// result = await app.AcquireTokenByUsernamePassword(scopes,"joe@contoso.com",securePassword).ExecuteAsync();
}
catch (MsalException)
{
///
}
try
{
result = await app.AcquireTokenInteractive(scopes).ExecuteAsync();
}
catch (MsalException)
{
///
}
}
token = result.AccessToken;
// Use the token
GraphServiceClient graphClient = new GraphServiceClient(
"https://graph.microsoft.com/v1.0",
new DelegateAuthenticationProvider(
async (requestMessage) =>
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);
}));
return graphClient;
}