Реализация аутентификации на основе ROPC в ядре asp .net - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь реализовать поток ROPC в API asp.net.Подскажите, пожалуйста, как правильно добиться этого в ядре ASP.net, используя встроенную библиотеку аутентификации.Если это невозможно, каковы альтернативы

Я могу получить токен доступа с помощью http-вызова к конечной точке Azure AD токен.Но я не могу проверить токен, используя встроенную библиотеку аутентификации, мы можем реализовать это без HTTP-вызова, но используя встроенную библиотеку.

services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme) .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));

Я использую приведенный ниже кодфрагмент для получения токена доступа

 private async Task<string> GetTokenAsync(string username, string password)
    {
        string grantType = "password";
        string tenantId = Configuration["AzureAdNative:TenantId"];
        string clientId = Configuration["AzureAdNative:ClientId"];
        string resource = Configuration["AzureAdNative:Resource"];


        string endpoint = "https://login.microsoftonline.com/" + tenantId + "/oauth2/token";


        HttpClient client = new HttpClient();


        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));


        var dict = new Dictionary<string, string>();
        dict.Add("grant_type", grantType);
        dict.Add("client_id", clientId);
        dict.Add("username", username);
        dict.Add("password", password);
        dict.Add("resource", resource);

        var req = new HttpRequestMessage(HttpMethod.Post, endpoint) { Content = new FormUrlEncodedContent(dict) };
        var res = await client.SendAsync(req);
        string result = res.Content.ReadAsStringAsync().Result;
        var jwt = JObject.Parse(result);

        return result;
       // return jwt.GetValue("access_token").ToString();
    }

, получающего несанкционированную ошибку 401 при проверке с использованием приведенного выше кода.токен доступа отправляется в заголовке авторизации (например: Авторизация: Bearer e4dgkddskdsdk).

1 Ответ

0 голосов
/ 03 мая 2019

Вы можете попробовать это. Просто измените информацию вашего запроса, вот и все.

Формат учетных данных пароля владельца ресурса

    private async Task<string> GetTokenByROPCFormat()
    {

        string tokenUrl = $"https://login.microsoftonline.com/YourTenantId/oauth2/token";
        var tokenRequest = new HttpRequestMessage(HttpMethod.Post, tokenUrl);

        tokenRequest.Content = new FormUrlEncodedContent(new Dictionary<string, string>
        {
            ["grant_type"] = "password",
            ["client_id"] = "b603c7be-a866-xxxxx-e6921e61f925",
            ["client_secret"] = "75c+8YRXnvHUi5hxxxxxC19Nhd0v0Slnb0djNGVsyM=",
            ["resource"] = "https://graph.microsoft.com",
            ["username"] = "mail@yourtenant.onmicrosoft.com",
            ["password"] = "YourPass"
        });

        dynamic json;
        dynamic results;
        HttpClient client = new HttpClient();

        var tokenResponse = await client.SendAsync(tokenRequest);

        json = await tokenResponse.Content.ReadAsStringAsync();
        results = JsonConvert.DeserializeObject<AccessToken>(json);



        //  New Block For Accessing Data from API
        HttpClient newClient = new HttpClient();

        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/me");

        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", results.access_token);
        HttpResponseMessage response = await newClient.SendAsync(request);

        string output = await response.Content.ReadAsStringAsync();
        return output;
    }

Класс, который я использовал для токена

 public  class AccessToken
        {
            public string access_token { get; set; }
            public string token_type { get; set; }
            public long expires_in { get; set; }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...