Доступ к идентификатору пользователя из контроллера в ASP.NET Core Web API - PullRequest
0 голосов
/ 06 сентября 2018

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

Документация 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://[site_name].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://[site_name].azurewebsites.net/api/AuthDetails

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

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

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

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

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

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

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

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

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

0 голосов
/ 08 сентября 2018

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

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

Вот шаги для воспроизведения моего сценария:

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://[site_name].azurewebsites.net/api/AuthDetails

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

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

{"X-MS-CLIENT-PRINCIPAL-NAME":"your_user@your_domain","X-MS-CLIENT-PRINCIPAL-ID":"your_user_ad_guid"}
0 голосов
/ 06 сентября 2018

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

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

services.AddAuthentication(IISDefaults.AuthenticationScheme);

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

Также к действиям в вашем контроллере необходимо добавить [Авторизовать]. Только когда это будет добавлено, вы сможете получить подробную информацию. Если вы добавляете на уровне контроллера, для действий, где вам не нужна аутентификация, вы можете добавить [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 );
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...