Получить идентификатор ASP.NET текущего пользователя в представлении

Я использую ASP.NET Identity 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; }
}

Ответ 1

Если есть только определенные свойства, которые вам нужно получить, вы можете добавить их в качестве претензий в свой класс 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;
}

Это связано с классом Startup.Aut:

    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();

Я бы рекомендовал кэширование, если вы вызываете это все это время.

Ответ 2

Есть два способа добиться этого.

1) Создайте собственный CustomPrincipal, наследуя IPrincipal интерфейс, чтобы включить Name, Surname и Email, используя этот пример или this one.

2) Получить данные непосредственно из базы данных и передать ее в качестве модели для представления.

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

Ответ 3

чтобы получить информацию о пользователе от контроллера, должен использовать

User.Identity.GetUserId();

или если вы хотите получить информацию о пользователе в своем классе

HttpContext.Current.User.Identity.GetUserId();

Ответ 4

Вы можете легко использовать вызов функции @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, когда вам нужно обратиться к текущему зарегистрированному пользователю.

Надеюсь, это будет удобно для всех:)