Получить текущего пользователя в действии ApiController без передачи идентификатора пользователя в качестве параметра

Как мы можем получить текущего пользователя в безопасном действии ApiController, не передавая имя пользователя или userId в качестве параметра?

Мы предполагаем, что это доступно, потому что мы находимся в безопасном действии. Быть в безопасном действии означает, что пользователь уже прошел аутентификацию, а запрос имеет свой токен-носитель. Учитывая, что WebApi разрешил пользователю, может быть встроенный способ доступа к userId, без необходимости передавать его в качестве параметра действия.

Ответ 1

В WebApi 2 вы можете использовать RequestContext.Principal из метода на ApiController

Ответ 2

Вы также можете получить доступ к главному, используя свойство User на ApiController.

Итак, следующие два утверждения в основном одинаковы:

string id;
id = User.Identity.GetUserId();
id = RequestContext.Principal.Identity.GetUserId();

Ответ 3

Подсказка заключается в автоматическом сгенерированном контроллере учетных записей Webapi2

У этого свойства с геттером определяется как

public string UserIdentity
        {
            get
            {
                var user = UserManager.FindByName(User.Identity.Name);
                return user;//user.Email
            }
        }

и для того, чтобы получить UserManager - В WebApi2 -do как римляне (читайте как AccountController)

public ApplicationUserManager UserManager
        {
            get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
        }

Это должно быть совместимо в режиме IIS и самообслуживания

Ответ 4

Ответ Karan Bhandari хорош, но AccountController, добавленный в проект, скорее всего будет Mvc.Controller. Чтобы преобразовать его ответ для использования в изменении ApiController HttpContext.Current.GetOwinContext() в Request.GetOwinContext() и убедитесь, что вы добавили следующие 2 using:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

Ответ 5

В .Net Core используйте User.Identity.Name, чтобы получить заявку на имя пользователя.

Ответ 6

Если вы используете Asp.Identity UseManager, он автоматически устанавливает значение

RequestContext.Principal.Identity.GetUserId()

на основе IdentityUser, который используется при создании IdentityDbContext.

Если вы когда-либо выполняете пользовательскую таблицу пользователя и аутентификацию на предъявителя токена owin, просьба проверить мой ответ.

Как получить контекст пользователя во время вызовов Web Api?

Надеюсь, что это все еще помогает.:)

Ответ 7

Ни одно из приведенных выше предложений не помогло мне. Было сделано следующее:

HttpContext.Current.Request.LogonUserIdentity.Name

Я предполагаю, что существует множество сценариев, и это работало для меня. Мой сценарий включал интерфейс AngularJS и бэкэнд-приложение Web API 2, работающие под IIS. Я должен был установить оба приложения для запуска исключительно под Windows Authentication.

Не нужно передавать какую-либо информацию пользователя. Браузер и IIS обмениваются зарегистрированными учетными данными пользователя, и веб-API имеет доступ к учетным данным пользователя по запросу (из IIS, который я предполагаю).

Ответ 8

string userName;
string userId;
if (HttpContext.Current != null && HttpContext.Current.User != null 
        && HttpContext.Current.User.Identity.Name != null)
{
    userName = HttpContext.Current.User.Identity.Name;
    userId = HttpContext.Current.User.Identity.GetUserId();
}

Или на основе комментария Даррела Миллера, возможно, используйте это, чтобы сначала получить HttpContext.

// get httpContext
object httpContext;
actionContext.Request.Properties.TryGetValue("MS_HttpContext", out httpContext);    

См. также:

Как получить доступ к HTTPContext в рамках действия вашего веб-API

Ответ 9

Если вы используете Windows Active Directory, вы можете добавить

   using System.DirectoryServices.AccountManagement

и в методе api, получите полное имя как таковое:

var fullName = UserPrincipal.Current.DisplayName;