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


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

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

8 69

8 ответов:

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

вы также можете получить доступ к основные использовать User собственности на ApiController.

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

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

подсказка лежит в Webapi2 авто сгенерированный контроллер учетной записи

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

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

и для того, чтобы получить UserManager-в WebApi2-do as Romans (читать как AccountController) do

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

Это должно быть совместимо в IIS и self host mode

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

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

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

RequestContext.Главный.Тождественность.GetUserId()

на основе IdentityUser вы используете в создании IdentityDbContext.

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

как получить пользовательский контекст во время веб-Api звонки?

надеюсь, что это все-таки помогает. :)

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

ни одно из предложений выше не работало для меня. Следующее сделал!

HttpContext.Current.Request.LogonUserIdentity.Name

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

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

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