如何在_Layout.cshtml中检索身份声明值

时间:2018-08-10 18:56:28

标签: c# asp.net-mvc razor asp.net-identity claims-based-identity

我一直在寻找这个东西很久了,但仍然无法获得正确的答案。我正在使用身份声明进行用户身份验证,并且在_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; ;

}

我可以检索自定义的Claims( ImageLink,OperationType )值,但无法检索具有相同模式的( Name,Sid )。我发现一些关于扩展方法的答案。是检索值的唯一方法还是其他方法? 预先感谢

1 个答案:

答案 0 :(得分:-1)

您可以使用html.RenderPartial()从布局中调用的方法来创建LayoutController(来自@Erik Philips下方的注释)。

onClick

在视图中,名称值被注入到private Button myButton; private MediaPlayer mp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.myactivity); mp = MediaPlayer.create(this, R.raw.gunshot); myButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mp.start(); } }); } } 中。

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