Войдите в систему с помощью необработанного HttpRequestMessage в ASP. NET MVC - PullRequest
0 голосов
/ 06 февраля 2020

Я тестировал некоторый код для входа пользователей в свои учетные записи Microsoft / school / work, используя необработанные HttpRequestMessage и HttpResponseMessage. Я знаю, что для этого есть библиотеки, но я хочу также протестировать и необработанный подход (особенно использование токенов refre sh), при этом ища подходящую библиотеку для его обработки. В настоящее время я изучаю аутентификацию, с ограниченными знаниями ASP .NET / Core.

Я следую этому руководству: https://docs.microsoft.com/en-us/graph/auth-v2-user Я только что изменил SignIn () метод в AccountController в примере проекта, который использовал более высокоуровневые библиотеки для входа. Я запрашиваю код авторизации.

Код SignIn ():

    public void SignIn()
    {
        using (var httpClient = new HttpClient())
        {
            try
            {
                var tenant = "my tenant id";
                var clientId = ConfigurationManager.AppSettings["ida:AppID"];
                var responseType = "id_token+code";
                var redirectURI = ConfigurationManager.AppSettings["ida:RedirectUri"];
                var responseMode = "form_post";//query";
                var appScopes = ConfigurationManager.AppSettings["ida:AppScopes"];
                var scopes = $"openid profile offline_access {appScopes}";
                var state = "12345";
                //var prompt = "consent";
                var url = string.Format("https://login.microsoftonline.com/{0}/oauth2/v2.0/authorize", tenant);
                var body = string.Format("client_id={1}&response_type={2}&redirect_uri={3}&response_mode={4}&scope={5}&state={6}", tenant, clientId, responseType, redirectURI, responseMode, scopes, state);
                var request = new HttpRequestMessage(HttpMethod.Post, url);
                request.Content = new StringContent(body, Encoding.UTF8, "application/x-www-form-urlencoded");
                var response = httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead).Result;
                var content = response.Content.ReadAsStringAsync().Result;
            }
            catch (Exception ex)
            {
            }
        }
        //if (!Request.IsAuthenticated)
        //{
        //    // Signal OWIN to send an authorization request to Azure
        //    Request.GetOwinContext().Authentication.Challenge(
        //        new AuthenticationProperties { RedirectUri = "/" },
        //        OpenIdConnectAuthenticationDefaults.AuthenticationType);
        //}
    }

Я просто возвращаю void из метода сейчас, потому что я не уверен, что мне следует возвращать.

Отладка и, глядя на переменную ответа, код состояния равен 200 и содержит некоторую другую информацию. Однако содержимое HttpResponseMessage, когда я вставляю его в файл и открываю в браузере, отображает (или перенаправляет на) https://login.microsoftonline.com/cookiesdisabled, которое показывает сообщение о том, что я не могу войти в систему. потому что мой браузер блокирует куки. Тем не менее, я не думаю, что это действительно так.

Как я могу решить эту проблему и заставить пользователя войти в систему и согласиться, и получить код авторизации?

Я не мог на самом деле найдите любой пример в ASP. NET, который использует этот необработанный подход. Разве это не рекомендуется?

1 Ответ

1 голос
/ 07 февраля 2020

Вы должны четко понимать, как работает код авторизации OAuth 2.0 в Azure AD V2.0:

Платформа идентификации Microsoft и поток кода авторизации OAuth 2.0

Общий процесс будет выглядеть следующим образом:

  1. При входе в клиентское приложение пользователь будет перенаправлен на Azure конечную точку входа AD (https://login.microsoftonline.com/{0}/oauth2/v2.0/authorize) и предоставляет информацию о том, какой клиент (* 1012) *) в котором пользователь арендатора (идентификатор арендатора) хочет войти в систему и перенаправить обратно на какой URL (redirect_uri) после успешного входа в систему.

  2. Учетные данные для ввода пользователя, Azure подтверждение AD введите учетные данные и введите code и перенаправьте пользователя обратно на URL-адрес перенаправления, указанный на шаге 1 (также соответствует одному из redirect_uris, зарегистрированному на портале).

  3. Клиентское приложение получит код и отправьте запрос HTTP пост с кодом для получения токена доступа.

Так что если вы хотите вручную реализовать поток кода в вашем приложении, вы можете обратиться к приведенному ниже примеру кода:

public async Task<IActionResult> Login()
{

    string authorizationUrl = string.Format(
    "https://login.microsoftonline.com/{0}/oauth2/v2.0/authorize?response_type=code&client_id={1}&redirect_uri={2}&scope={3}",
    "tenantID", "ClientID", "https://localhost:44360/Home/CatchCode",
    "openid offline_access https://graph.microsoft.com/user.read");

    return Redirect(authorizationUrl);

}
private static readonly HttpClient client = new HttpClient();

public async Task<ActionResult> CatchCode(string code)
{
    var values = new Dictionary<string, string>
    {
        { "grant_type", "authorization_code" },
        { "client_id", "XXXXXX"},
        { "code", code},
        { "redirect_uri", "https://localhost:44360/Home/CatchCode"},
        { "scope", "https://graph.microsoft.com/user.read"},
        { "client_secret", "XXXXXXXXXXX"},
    };

    var content = new FormUrlEncodedContent(values);

    //POST the object to the specified URI 
    var response = await client.PostAsync("https://login.microsoftonline.com/cb1c3f2e-a2dd-4fde-bf8f-f75ab18b21ac/oauth2/v2.0/token", content);

    //Read back the answer from server
    var responseString = await response.Content.ReadAsStringAsync();
    //you can  deserialize an Object use Json.NET to get tokens
}

Это простой пример кода, который получит токен доступа Microsoft Graph, вам все еще нужно позаботиться об исключении кодирования и перехвата URL, но он показывает, как работает поток кода.

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