Ответ 1
В WebApi 2 вы можете использовать RequestContext.Principal
из метода на ApiController
Как мы можем получить текущего пользователя в безопасном действии ApiController, не передавая имя пользователя или userId в качестве параметра?
Мы предполагаем, что это доступно, потому что мы находимся в безопасном действии. Быть в безопасном действии означает, что пользователь уже прошел аутентификацию, а запрос имеет свой токен-носитель. Учитывая, что WebApi разрешил пользователю, может быть встроенный способ доступа к userId, без необходимости передавать его в качестве параметра действия.
В 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 как римляне (читайте как AccountController)
public ApplicationUserManager UserManager
{
get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
}
Это должно быть совместимо в режиме IIS и самообслуживания
Ответ Karan Bhandari хорош, но AccountController, добавленный в проект, скорее всего будет Mvc.Controller
. Чтобы преобразовать его ответ для использования в изменении ApiController HttpContext.Current.GetOwinContext()
в Request.GetOwinContext()
и убедитесь, что вы добавили следующие 2 using
:
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
В .Net Core используйте User.Identity.Name
, чтобы получить заявку на имя пользователя.
Если вы используете Asp.Identity UseManager, он автоматически устанавливает значение
RequestContext.Principal.Identity.GetUserId()
на основе IdentityUser, который используется при создании IdentityDbContext.
Если вы когда-либо выполняете пользовательскую таблицу пользователя и аутентификацию на предъявителя токена owin, просьба проверить мой ответ.
Как получить контекст пользователя во время вызовов Web Api?
Надеюсь, что это все еще помогает.:)
Ни одно из приведенных выше предложений не помогло мне. Было сделано следующее:
HttpContext.Current.Request.LogonUserIdentity.Name
Я предполагаю, что существует множество сценариев, и это работало для меня. Мой сценарий включал интерфейс AngularJS и бэкэнд-приложение Web API 2, работающие под IIS. Я должен был установить оба приложения для запуска исключительно под Windows Authentication.
Не нужно передавать какую-либо информацию пользователя. Браузер и 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
Если вы используете Windows Active Directory, вы можете добавить
using System.DirectoryServices.AccountManagement
и в методе api, получите полное имя как таковое:
var fullName = UserPrincipal.Current.DisplayName;