Смешайте аутентификацию MSAL и MVC Forms - PullRequest
0 голосов
/ 07 ноября 2019

Я работаю над одним клиентским веб-приложением 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);
    }

Не возвращено ни одной учетной записи, единственный способ увидеть кэшированные токены - это еслиЯ оставляю настройки по умолчанию, чтобы они не хранились против пользователя.

1 Ответ

0 голосов
/ 08 ноября 2019

К сожалению, MSAL.NET (и MSAL в целом) не предоставляет токен обновления.

Вы можете видеть, что в AuthenticationResult нет "refreshToken".

, с которым вы можете справитьсяавтоматическое обновление токена путем вызова AcquireTokenSilent.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...