ClaimType.GivenName не возвращает мое имя - PullRequest
0 голосов
/ 12 марта 2019

Я занимаюсь разработкой приложения .net core 2.2, которое проходит аутентификацию в Azure AD.Я хотел бы получить имя пользователя в _LoginPartial.cshtml в веб-приложении RAZOR.Я могу получить фамилию и адрес электронной почты пользователя, но не имя.Есть ли где-нибудь, чтобы получить это?

Это то, что у меня есть в моем частичном представлении входа в систему:

Claim nameClaim = User.Claims.FirstOrDefault<Claim>(claim => string.Compare(claim.Type, "name", StringComparison.Ordinal) == 0);
    string userName = (nameClaim != null) && !string.IsNullOrEmpty(nameClaim.Value) ? nameClaim.Value : ((User != null) && (User.Identity != null) ? User.Identity.Name : string.Empty);

Также я попробовал это:

@User.FindFirst(System.Security.Claims.ClaimTypes.GivenName).Value

Имявозвращает адрес электронной почты так же, как имя и свойства электронной почты!

Каким был бы идеальный способ получить имя, расширив модель идентичности в asp.net?

1 Ответ

1 голос
/ 12 марта 2019

Для удостоверения во встроенном IdentityUser нет FirstName, вам нужно реализовать своего собственного пользователя, например:

public class ApplicationUser:IdentityUser
{
    public string FirstName { get; set; }
}

Затем внедрить UserClaimsPrincipalFactory<ApplicationUser>

public class CustomClaimsIdentityFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
    public CustomClaimsIdentityFactory(UserManager<ApplicationUser> userManager
        , IOptions<IdentityOptions> optionsAccessor) 
        : base(userManager, optionsAccessor)
    {
    }

    public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
    {
        var principal = await base.CreateAsync(user);
        //custom claims
        ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
          new Claim("FirstName", user.FirstName)
          });
        return principal;
    }
}

Затем вы можете проверить FirstName по @User.Claims.FirstOrDefault(c => c.Type == "FirstName")?.Value как

@using Microsoft.AspNetCore.Identity
@using TestIdentity.Data
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager

<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
    <li class="nav-item">
        <a  class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @User.Claims.FirstOrDefault(c => c.Type == "FirstName")?.Value!</a>
    </li>
    <li class="nav-item">
        <form  class="form-inline" asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "Home", new { area = "" })">
            <button  type="submit" class="nav-link btn btn-link text-dark">Logout</button>
        </form>
    </li>
}
else
{
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
    </li>
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
}
</ul>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...