Получить ASP.NET Identity текущий пользователь в поле зрения
Я использую ASP.NET идентичность 2.0 и MVC. Мне нужно войти имя пользователя, фамилия, электронная почта и т. д.. в виду. Как его достать? Я могу получить только @User.Identity, но нет свойства моего класса пользователя.
//in my view, i need here my ApplicationUser class
<div>
@User.Identity.Name
</div>
//ApplicationUser class
public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole,
CustomUserClaim>
{
public ApplicationUser()
{
this.CreatedDate = DateTime.Now;
}
public DateTime CreatedDate { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string TaxOffice { get; set; }
}
4 ответов
Если вам нужно получить только определенные свойства, вы можете добавить их в качестве утверждений в свой класс ApplicationUser, например:
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, int> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
userIdentity.AddClaim(new Claim("FullName", this.FullName));
// or use the ClaimTypes enumeration
return userIdentity;
}
это подключается от запуска.Auth class:
SessionStateSection sessionStateSection = ConfigurationManager.GetSection("system.web/sessionState") as SessionStateSection;
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/account/login"),
CookieName = sessionStateSection.CookieName + "_Application",
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, int>
(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
getUserIdCallback: (id) => (id.GetUserId<int>())
)
}
});
затем вы можете получить доступ к утверждению (в представлении или в контроллере):
var claims = ((System.Security.Claims.ClaimsIdentity)User.Identity).Claims;
var claim = claims.SingleOrDefault(m => m.Type == "FullName");
здесь нет билетов аутентификации форм.
если вы хотите получить полную информацию о пользователе, вы всегда можете создать метод расширения, такой как следующее:
public static ApplicationUser GetApplicationUser(this System.Security.Principal.IIdentity identity)
{
if (identity.IsAuthenticated)
{
using (var db = new AppContext())
{
var userManager = new ApplicationUserManager(new ApplicationUserStore(db));
return userManager.FindByName(identity.Name);
}
}
else
{
return null;
}
}
и назовите это так:
@User.Identity.GetApplicationUser();
Я бы рекомендовал кэширование, если вы вызываете это все это время, однако.
есть два способа достичь этого.
1) Создайте свой собственный CustomPrincipal
наследование IPrincipal
интерфейс для включения Name
, Surname
и Email
используя этой или этой один.
2) получить информацию непосредственно из базы данных и передать его в качестве модели для представления.
метод один будет хорошим вариантом, если вы хотите использовать одни и те же данные пользователя в нескольких представлениях, но метод два-самый простой способ достичь этого. дайте мне знать если вам нужна помощь кода для второго метода.
вы можете легко использовать @inject
функция вызова для инъекций обоих UserManager
и SignInManager
.
на ваш взгляд добавить следующее:
@inject SignInManager<YourUserIdentity> SignInManager
@inject UserManager<YourUserIdentity> UserManager
после впрыски, вы должны мочь работать с UserManager
и SignInManager
методы. Например:
@if (SignInManager.IsSignedIn(User))
{
<a asp-area="" asp-controller="Manage" asp-action="Index" title="Manage">Hello @UserManager.GetUserName(User)</a>
}
else
{
}
обратите внимание на прохождение
User
объект, когда вам нужно ссылаться на текущего пользователя.
надеюсь, это будет удобно для всех :)
получить информацию о пользователе из контроллера должен использовать
User.Identity.GetUserId();
или если вы хотите получить информацию о пользователе в свой класс
HttpContext.Current.User.Identity.GetUserId();