Пользователь перенаправления с параметром id_token в URL-адресе перенаправления приводит к тому, что пользователь Identity имеет значение Null - PullRequest
0 голосов
/ 31 декабря 2018

Я работал с аутентификацией AADB2C и изо всех сил пытался перенаправить пользователя на домашнюю страницу с id_token в качестве фрагмента в URL перенаправления.ниже показано, как я могу инициировать проверку подлинности в контроллере учетной записи

public class AccountController : Controller
{
    public AzureAdB2COptions AzureAdB2COptions { get; set; }

    public AccountController(IOptions<AzureAdB2COptions> b2cOptions)
    {
        AzureAdB2COptions = b2cOptions.Value;
    }
    // GET: /<controller>/
    [HttpGet]
    public IActionResult SignUpSignIn()
    {
        var redirectUrl = "http://localhost:7878/dasdfsd/home";
        return Challenge(
            new AuthenticationProperties { RedirectUri = redirectUrl },
            OpenIdConnectDefaults.AuthenticationScheme);

    }
}

, а ниже показано, где я перенаправляю пользователя для перенаправления URL (http://localhost:7878/dgddfg/home) с токеном id, фрагментированным вместе с URL

            public async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedContext context)
        {

            // Use MSAL to swap the code for an access token
            // Extract the code from the response notification
            var code = context.ProtocolMessage.Code;

            string signedInUserID = context.Principal.FindFirst(ClaimTypes.NameIdentifier).Value;
            TokenCache userTokenCache = new MSALSessionCache(signedInUserID, context.HttpContext).GetMsalCacheInstance();
            ConfidentialClientApplication cca = new ConfidentialClientApplication(AzureAdB2COptions.ClientId, AzureAdB2COptions.Authority, AzureAdB2COptions.RedirectUri, new ClientCredential(AzureAdB2COptions.ClientSecret), userTokenCache, null);
            try
            {
                AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(code, AzureAdB2COptions.ApiScopes.Split(' '));
                context.HandleCodeRedemption(result.AccessToken, result.IdToken);
                context.HandleResponse();
                context.Response.Redirect("dfgfd/home#grant_type=" + context.ProtocolMessage.GrantType + "&id_token=" + result.IdToken);
            }
            catch (Exception)
            {
                //TODO: Handle
                throw;
            }
        }

когда пользователь перенаправляет на домашнюю страницу, используя javascript, я получаю id_token из URL и вызываю действие контроллера учетной записи («GetAccessTokenAsync»), чтобы получить токен доступа с использованием идентификатора пользователя

 [HttpGet]
    public async Task<string> GetAccessTokenAsync()
    {
       string signedInUserID = HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
        TokenCache userTokenCache = new MSALSessionCache(signedInUserID , HttpContext).GetMsalCacheInstance();
        ConfidentialClientApplication cca = new ConfidentialClientApplication(AzureAdB2COptions.ClientId, AzureAdB2COptions.Authority, AzureAdB2COptions.RedirectUri, new ClientCredential(AzureAdB2COptions.ClientSecret), userTokenCache, null);
        try
        {
            var userAccounts = await cca.GetAccountsAsync();
            if (userAccounts == null && userAccounts.Count()==0)
            {
                throw new Exception("The User is NULL.  Please clear your cookies and try again.  Specifically delete cookies for 'login.microsoftonline.com'.  See this GitHub issue for more details: https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi/issues/9");
            }
            AuthenticationResult result = await cca.AcquireTokenSilentAsync(AzureAdB2COptions.ApiScopes.Split(' '),userAccounts.FirstOrDefault());
            return result.AccessToken;

        }
        catch (Exception ex)
        {
            //TODO: Handle
            return "";
        }
    }

, проблема здесь заключается в HttpContext.Userв методе действия имеет значение null, но если я удалю часть, в которой я написал URL-адрес перенаправления с добавленным id_token и context.HandleResponse(); в OnAuthorizationCodeReceived, пользователь будет перенаправлен без маркера id, но когда выполненное действие getAccessToken HttpContext.User не будетnull, у пользователя будут все детали, включая утверждения.

Как я могу перенаправить пользователя с токеном id в URL, а также иметь пользователя, не являющегося нулевым, для получения токена доступа в методе контроллера? Это как-то связано с cookie?

1 Ответ

0 голосов
/ 01 января 2019

Я не знаю, зачем вам нужен ID-токен в javascript, ID-токен содержит информацию о профиле пользователя (например, имя пользователя, адрес электронной почты и т. Д.), Эти утверждения являются заявлениями о пользователе, но не должны содержать конфиденциальную информацию.

Если вы хотите получить утверждения пользователя, вы можете запросить утверждения из объекта HttpContext.User и передать связанные утверждения на сторону клиента.Или напрямую получите информацию о профиле пользователя из Azure AD с помощью Microsoft Graph API.

Вы можете использовать cookie для хранения токена идентификатора в событии OnAuthorizationCodeReceived, например:

 context.Response.Cookies.Append("IDToken", context.ProtocolMessage.IdToken, new CookieOptions()
            {
                Path = "/",
                HttpOnly = false,
                Secure = true
            });

и получить доступзначение на стороне сервера:

 var idToken= Request.Cookies["IDToken"];

Но вы должны касаться проблемы безопасности.При использовании с флагом cookie HttpOnly (= true) не доступны через JavaScript и защищены от XSS.Вы также можете установить флажок Безопасный файл cookie, чтобы гарантировать, что файл cookie отправляется только через HTTPS.Однако файлы cookie уязвимы для атак подделки межсайтовых запросов (CSRF).Вы можете обратиться к этой теме , в которой подробно обсуждается эта тема.

Короче говоря, вы можете сохранить маркер идентификатора в файле cookie.Но я бы предложил получить претензии пользователя от объекта HttpContext.User.

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