Получить текущего пользователя ASP.NET Visual Studio 2013 Preview ClaimsPrinciple

Я пытаюсь получить текущего пользователя в проекте веб-форм, используя новый предварительный просмотр Visual Studio 2013 для Интернета. Я могу получить имя пользователя с помощью Page.User, но попытка получить идентификатор пользователя - вот где я застрял. Он использует эту новую модель идентичности, которую они придумали.

Вот что у меня есть:

//Gets the correct username
string uname = User.Identity.Name;
//Returns a null object
Microsoft.AspNet.Identity.IUser user = IdentityConfig.Users.Find(uname);
//What I hope to call to add a user to a role
IdentityConfig.Roles.AddUserToRole("NPO", user.Id);

comment
Не могли бы вы показать код?   -  person Garrison Neely    schedule 10.09.2013
comment
Извините, да. Там сейчас пример кода.   -  person Jack    schedule 10.09.2013


Ответы (3)


Если вы используете членство по умолчанию, которое поставляется с шаблоном ASP.NET WebForms, вы должны сделать что-то вроде этого, чтобы получить пользователя:

if (this.User != null && this.User.Identity.IsAuthenticated)
{
  var userName = HttpContext.Current.User.Identity.Name;
}

Новая модель, о которой вы говорите, это ClaimsPrincipal. Уникальное отличие состоит в том, что это утверждения на основе Security, полностью совместимый со старыми версиями, но более мощный.

РЕДАКТИРОВАТЬ:

Чтобы добавить пользователя к какому-то Role программно, вы должны сделать это, передав имя пользователя и имя роли:

if (this.User != null && this.User.Identity.IsAuthenticated)
{
  var userName = HttpContext.Current.User.Identity.Name;
  System.Web.Security.Roles.AddUserToRole(userName, "Role Name");    
}

Использование новой системы безопасности на основе утверждений

if (this.User != null && this.User.Identity.IsAuthenticated)
{
  var userName = HttpContext.Current.User.Identity.Name;
  ClaimsPrincipal cp = (ClaimsPrincipal)HttpContext.Current.User;

  GenericIdentity genericIdentity;
  ClaimsIdentity claimsIdentity;
  Claim claim;

  genericIdentity = new GenericIdentity(userName, "Custom Claims Principal");

  claimsIdentity = new ClaimsIdentity(genericIdentity);

  claim = new Claim(ClaimTypes.Role, "Role Name");
  claimsIdentity.AddClaim(claim);

  cp.AddIdentity(claimsIdentity);
}
person Fals    schedule 10.09.2013
comment
Это здорово, я рад узнать, как это теперь называется. Единственное, как мне добавить пользователя в роль? Для функции Roles.AddUserToRole требуется идентификатор. Кажется, я не могу найти это. - person Jack; 10.09.2013
comment
Хорошо... тогда как мне получить все роли, с которыми связан пользователь? Скажем, хочу ли я ограничить доступ к папке или файлу в зависимости от роли, которой они принадлежат? - person Jack; 10.09.2013
comment
Дополнительные сведения см. здесь: msdn.microsoft.com /en-us/library/system.web.security.roles.aspx - person Fals; 10.09.2013
comment
Однако я не могу просто использовать класс роли, потому что RoleManager отключен по умолчанию, верно? - person Jack; 10.09.2013

Идентификатор пользователя по умолчанию хранится в утверждении ClaimTypes.NameIdentifier. Мы также предоставили метод расширения, который находится в Microsoft.AspNet.Identity, поэтому вы можете просто вызвать Page.User.Identity.GetUserId() вместо того, чтобы извлекать пользователя только для получения идентификатора.

person Hao Kung    schedule 11.09.2013
comment
Определенно не работает для меня. У меня есть идентификатор претензии, но GetUserId() возвращает значение null. Первичный ключ в таблицах Users — это GUID. - person Greg; 23.08.2014

Просто пост для людей, которые находят это сегодня, теперь это очень легко сделать

ApplicationUserManager manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
ApplicationSignInManager signinManager = Context.GetOwinContext().GetUserManager<ApplicationSignInManager>();
ApplicationUser user = signinManager.UserManager.FindByNameAsync("username").Result;

На данный момент у вас есть доступ ко всему идентификатору, электронной почте, номеру телефона, даже к хешированной версии пароля пользователя.

person Jacqueline Loriault    schedule 24.04.2017