Я работаю над одним клиентским веб-приложением MVC с несколькими пользователями. Существует несколько развертываний этого приложения для разных клиентов, и некоторые клиенты хотели бы отправлять почту через Outlook 365. Приложение использует проверку подлинности на основе форм с пользователями, хранящимися в базе данных.
Я пытался заставить что-то работать на основеследующий пример - https://github.com/Azure-Samples/ms-identity-aspnet-webapp-openidconnect - однако он конфликтует с проверкой подлинности форм, поскольку я возвращаюсь на страницу входа в формы, даже если вход выполнен успешно.
Я могу успешно получить токен доступа с помощьюнаправление пользователя к входу в Azure AD после успешного входа в систему:
var url = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?" +
"client_id=" + AuthenticationConfig.ClientId +
"&response_type=code" +
"&redirect_uri=" + AuthenticationConfig.RedirectUri +
"&response_mode=query" +
"&scope=" + AuthenticationConfig.BasicSignInScopes +
"&state=12345";
Затем для обратного вызова используйте следующее для получения токена доступа:
public static async Task<string> GetAccessToken(string code)
{
var app = ConfidentialClientApplicationBuilder
.Create(AuthenticationConfig.ClientId)
.WithClientSecret(AuthenticationConfig.ClientSecret)
.WithRedirectUri(AuthenticationConfig.RedirectUri)
.WithAuthority(AuthenticationConfig.Authority)
.Build();
var scopes = new List<string> { "offline_access", "user.read", "mail.read", "mail.send" };
var authenticationResult = await app.AcquireTokenByAuthorizationCode(scopes, code).ExecuteAsync();
return authenticationResult.AccessToken;
}
Однако токен обновления не возвращаетсяв результате аутентификации. Я надеялся получить токен / срок действия и обновить токен / срок действия и сохранить их, чтобы пользователь мог один раз пройти аутентификацию через Azure AD, а затем я мог бы в будущем без предупреждения обновить токен, используя токен обновления.
Я много читал, но большая часть информации, которую я могу найти, основана на использовании входа Azure AD для вашего приложения. Мне нужно сохранить логин формы и пройти аутентификацию только для отправки электронной почты. Возможно ли это?
ОБНОВИТЬ, чтобы попытаться кэшировать токен против пользователя и прочитать его обратно:
public static async Task OnAuthorisationCodeReceived(string code)
{
var app = ConfidentialClientApplicationBuilder
.Create(AuthenticationConfig.ClientId)
.WithClientSecret(AuthenticationConfig.ClientSecret)
.WithRedirectUri(AuthenticationConfig.RedirectUri)
.WithAuthority(AuthenticationConfig.Authority)
.Build();
var scopes = new List<string> { "offline_access", "user.read", "mail.read", "mail.send" };
var authenticationResult = await app.AcquireTokenByAuthorizationCode(scopes, code).ExecuteAsync();
var account = authenticationResult.Account;
var identity = new ClaimsIdentity();
identity.AddClaim(new System.Security.Claims.Claim(ClaimConstants.ObjectId, account.HomeAccountId.ObjectId));
identity.AddClaim(new System.Security.Claims.Claim(ClaimConstants.TenantId, account.HomeAccountId.TenantId));
identity.AddClaim(new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Upn, account.Username));
var claimsPrincipal = new ClaimsPrincipal(identity);
// as per example store the cache
var userTokenCache = new MSALPerUserMemoryTokenCache(app.UserTokenCache, claimsPrincipal);
// no accounts returned
var accounts = await app.GetAccountsAsync();
var newres = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault()).ExecuteAsync().ConfigureAwait(false);
}
Не возвращено ни одной учетной записи, единственный способ увидеть кэшированные токены - это еслиЯ оставляю настройки по умолчанию, чтобы они не хранились против пользователя.