Как получить значения утверждений идентичности в _Layout.cshtml

Я долго искал эту вещь в Google, но все еще не могу получить правильный ответ. Я использую утверждение личности для аутентификации пользователя, и мне нужны некоторые значения утверждения на моей странице _Layout.cshtml. Однако я могу получить значения настраиваемых утверждений удостоверений, но не встроенные.

Здесь я установил свою личность:

 var ident = new ClaimsIdentity(
                new[] { 
                    // adding following 2 claim just for supporting default antiforgery provider
                    new Claim(ClaimTypes.NameIdentifier, user.LoginId),
                    new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"),
                    new Claim(ClaimTypes.Name,user.UserName),
                    new Claim(ClaimTypes.Sid,user.UserId.ToString()),
                    new Claim("OperationType", user.OperationType.ToString()),
                    new Claim("ImageLink", user.ImageLink.ToString())

                },
                DefaultAuthenticationTypes.ApplicationCookie);
            var claimsPrincipal = new ClaimsPrincipal(ident);
            // Set current principal
            Thread.CurrentPrincipal = claimsPrincipal;

и мой код страницы макета:

@using System.Security.Claims;
...........
@{  
    string userDesignation = ((ClaimsIdentity)User.Identity).FindFirst("OperationType").Value; ;
    string userImage = ((ClaimsIdentity)User.Identity).FindFirst("ImageLink").Value; ;

}

Я могу получить значения своих пользовательских утверждений (ImageLink, OperationType), но не смог получить (Name, Sid) с тем же шаблоном. Некоторые из найденных мной ответов касаются методов расширения. Это единственный способ получить значения или есть другой способ? заранее спасибо


person Parvez    schedule 10.08.2018    source источник
comment
Логика такого типа никогда не должна присутствовать в представлении (или макете). Вместо этого вы должны создать LayoutController с помощью метода, который вы вызываете из своего макета с помощью html.RenderPartial().   -  person Erik Philips    schedule 10.08.2018
comment
Вы не можете использовать промежуточное ПО для аутентификации OWIN? Пример   -  person Win    schedule 13.09.2018


Ответы (2)


Используйте пространство имен потоковой передачи в верхней части страницы макета.

@using System.Threading;

и получите доступ к своим типам претензий следующим образом

@{  
string userDesignation = ((ClaimsIdentity)User.Identity).FindFirst("OperationType").Value;
string userImage = ((ClaimsIdentity)User.Identity).FindFirst("ImageLink").Value;


var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;

    // Get the claims values
    var id= identity.Claims.Where(c => c.Type == ClaimTypes.Sid)
        .Select(c => c.Value).SingleOrDefault();
    var s = id;
//so on.......
}

Но @Erik Philips прав. Вы должны использовать эту логику как частичную.

person Md. Akhtar Uzzaman    schedule 13.09.2018

Вы можете создать LayoutController с помощью метода, который вы вызываете из своего макета с помощью html.RenderPartial () (из комментария ниже @Erik Philips).

TextInfo myTI = new CultureInfo("en-US", false).TextInfo;
var claimsIdentity = HttpContext.Current.User.Identity as System.Security.Claims.ClaimsIdentity;
var displayNameClaim = (claimsIdentity == null) ? null : claimsIdentity.Claims.SingleOrDefault(x => x.Type == ApplicationUser.DisplayNameClaimType);
var nameToDisplay = (displayNameClaim == null) ? HttpContext.Current.User.Identity.Name : displayNameClaim.Value;
var nameToDisplayTitle = myTI.ToTitleCase(nameToDisplay);

В представлении значение имени вставляется в <span class="NameDisplay"></span>.

$(".NameDisplay").html(@Html.Raw("\"" + nameToDisplayTitle + "\""));

В IdentityModels.cs я определяю следующее поле:

public class ApplicationUser : IdentityUser
{
    public const string DisplayNameClaimType = "FirstName";
    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    //etc.
}

и определите это утверждение:

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> 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(DisplayNameClaimType, FirstName));
    return userIdentity;
}
person Alfred Wallace    schedule 10.08.2018
comment
Логика такого типа никогда не должна присутствовать в представлении (или макете). Вместо этого вы должны создать LayoutController с помощью метода, который вы вызываете из своего макета с помощью html.RenderPartial(). - person Erik Philips; 10.08.2018
comment
Конструктивный комментарий - person Alfred Wallace; 10.08.2018