it-roy-ru.com

Доступ к идентификатору пользователя из контроллера в ASP.NET Core Web API

Согласно этой документации:

Документация ASP.NET Core 2.1

Я должен иметь доступ к идентификатору пользователя, используя ControllerBase.User или HttpContext.Use r.

По ссылке выше:

«Получение идентификатора текущего пользователя из коллекции сервисов DI приложения также более тестируемо, поскольку тестовые идентификаторы могут быть легко введены».

Как я понимаю, я должен внедрить идентификационную информацию, используя внедрение зависимостей в Startup.cs или, возможно, в конструкторе контроллера.

Однако, после бесконечных часов расследования, я не могу найти процедуру.

Следующие шаги описывают мой сценарий. Я надеюсь, что кто-то может направить меня в правильном направлении.

1) Используя Visual Studio 2017, создайте проект веб-API ASPNET.core со следующими параметрами:

  • Тип: API
  • Включить поддержку Docker: нет
  • Аутентификация: нет аутентификации
  • Настроить для HTTPS: да

2) Добавьте AuthDetailsController.cs в папки Controllers с помощью следующего кода:

using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace CoreWebApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthDetailsController : Controller
    {


        [HttpGet]
        public JsonResult Get()
        {
            var r = new Dictionary<String, Object>();

            r.Add("User.Identities", User.Identities);
            r.Add("User.Claims", User.Claims);
            r.Add("HttpContext.User.Identities", HttpContext.User.Identities);
            r.Add("HttpContext.User.Claims", HttpContext.User.Claims);

            return Json(r );
        }

    }
}

3) Развертывание в Azure как новое приложение.

4) Перейдите в https: // [имя_сайта] .azurewebsites.net/api/AuthDetails

5) Нет информации о личности пользователя, потому что доступ является анонимным:

{"User.Identities":[{"authenticationType":null,"isAuthenticated":false,"actor":null,"bootstrapContext":null,"claims":[],"label":null,"name":null,"nameClaimType":"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name","roleClaimType":"http://schemas.Microsoft.com/ws/2008/06/identity/claims/role"}],"User.Claims":[],"HttpContext.User.Identities":[{"authenticationType":null,"isAuthenticated":false,"actor":null,"bootstrapContext":null,"claims":[],"label":null,"name":null,"nameClaimType":"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name","roleClaimType":"http://schemas.Microsoft.com/ws/2008/06/identity/claims/role"}],"HttpContext.User.Claims":[]}

6) Включите аутентификацию Azure со следующими параметрами:

  • Действие, которое необходимо выполнить, если запрос не прошел проверку подлинности. Войдите в систему с помощью Azure Active Directory.
  • Конфигурация Azure Active Directory: экспресс-режим

7) Откройте снова https: // [имя_сайта] .azurewebsites.net/api/AuthDetails

8) Вы будете перенаправлены на страницу входа

9) После успешного входа в систему не будет идентифицирующей информации ни в ControllerBase.User, ни в HttpContext.User. Ответ такой же, как и до включения аутентификации. 

4
Pablo

Я сделал это !!!

Эта документация указала мне в правильном направлении.

Вот шаги, чтобы воспроизвести мой сценарий:

1) Используя Visual Studio 2017, создайте проект веб-API ASPNET.core со следующими параметрами:

  • Тип: API
  • Включить поддержку Docker: нет
  • Аутентификация: нет аутентификации
  • Настроить для HTTPS: да

2) Добавьте AuthDetailsController.cs в папку Controllers с помощью следующего кода:

using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;

namespace CoreWebApiTest2.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthDetailsController : ControllerBase
    {
        // GET: api/AuthDetails
        [HttpGet]
        public Dictionary<string,string> Get()
        {
            return new Dictionary<string, string> { {"X-MS-CLIENT-PRINCIPAL-NAME", Request.Headers["X-MS-CLIENT-PRINCIPAL-NAME"] },
                                                    {"X-MS-CLIENT-PRINCIPAL-ID", Request.Headers["X-MS-CLIENT-PRINCIPAL-ID"]  } };

        }
    }
}

3) Развертывание в Azure как новое приложение.

4) Включите аутентификацию Azure со следующими параметрами:

  • Действие, которое необходимо выполнить, если запрос не прошел проверку подлинности: войдите в систему Azure Active Directory.
  • Конфигурация Azure Active Directory: экспресс-режим

5) Открыть https: // [имя_сайта] .azurewebsites.net/api/AuthDetails

6) Вы перенаправлены на страницу входа

7) После успешного входа вы получите ответ:

{"X-MS-CLIENT-PRINCIPAL-NAME":"[email protected]_domain","X-MS-CLIENT-PRINCIPAL-ID":"your_user_ad_guid"}
0
Pablo

Этот пример работает:

https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2

Я могу идентифицировать пользователя в контроллере, используя:

User.FindAll("preferred_username").First().Value;

Это другой тип проекта. это веб-сайт MVC, а не проект API.

Это не совсем то, что я искал, но, по крайней мере, это работает ... Я буду исследовать, как применить это к моему проекту API.

0
Pablo

Вы должны указать аутентификацию, которая должна быть использована в вашем файле startup.cs.

Это было бы что-то вроде.

services.AddAuthentication(IISDefaults.AuthenticationScheme);

Ссылку на эту информацию можно найти на это .

Также к действиям в вашем контроллере нужно добавить [Авторизовать]. Только когда это будет добавлено, вы сможете получить подробную информацию. Если вы добавляете на уровне контроллера, для действий, где вам не нужна аутентификация, вы можете добавить [AllowAnonymous]

[HttpGet]
[Authorize]
        public JsonResult Get()
        {
            var r = new Dictionary<String, Object>();

            r.Add("User.Identities", User.Identities);
            r.Add("User.Claims", User.Claims);
            r.Add("HttpContext.User.Identities", HttpContext.User.Identities);
            r.Add("HttpContext.User.Claims", HttpContext.User.Claims);

            return Json(r );
        }
0
coolcake