【问题标题】:Access Claim values in controller in MVC 5在 MVC 5 中访问控制器中的声明值
【发布时间】:2014-04-10 09:22:32
【问题描述】:

我在我的应用程序中使用了 OWIN 身份验证。

登录操作

var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, result.UserFirstName));            
claims.Add(new Claim(ClaimTypes.Sid, result.UserID.ToString()));
var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);

我想通过不同的操作访问用户名和用户 ID。如何访问声明中添加的值?

更新 我试过了

var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, result.UserFirstName + " " + result.UserLastName));            
claims.Add(new Claim(ClaimTypes.Sid, result.UserIDNumber.ToString()));
var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
var authenticationManager = Request.GetOwinContext().Authentication;
authenticationManager.SignIn(identity);

var claimsPrincipal = new ClaimsPrincipal(identity);
Thread.CurrentPrincipal = claimsPrincipal;

我可以在快速窗口中查看值。但即使我无法访问该值。如何获取价值?

【问题讨论】:

标签: c# asp.net asp.net-mvc asp.net-mvc-5 claims


【解决方案1】:

您需要在登录后设置您的Thread.CurrentPrincipal,即

var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, result.UserFirstName));            
claims.Add(new Claim(ClaimTypes.Sid, result.UserID.ToString()));
var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
var claimsPrincipal = new ClaimsPrincipal(identity);
// Set current principal
Thread.CurrentPrincipal = claimsPrincipal;

然后下面将检索值。

//Get the current claims principal
var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;

// Get the claims values
var name = identity.Claims.Where(c => c.Type == ClaimTypes.Name)
                   .Select(c => c.Value).SingleOrDefault();
var sid = identity.Claims.Where(c => c.Type == ClaimTypes.Sid)
                   .Select(c => c.Value).SingleOrDefault();

【讨论】:

  • 我还是没有得到答案。你能检查一下上述问题中的更新吗?我已经描述了这个问题。
  • @Golda 您好,打开的调试窗口应该是查看 Claims 中的内容,您可以打开那个吗?
  • 能否请您再次查看我的问题更新。我仍然无法获得价值。
  • 它的工作。 var UserID = principal.Claims.Where(c => c.Type == ClaimTypes.Sid​​).Select(c => c.Value).SingleOrDefault();添加 .SingleOrDefault() 后它开始工作。
  • @DaveJellison 谢谢,很好发现。没有人注意到这一点。现已更新。
【解决方案2】:

这是另一个示例,也包含自定义声明类型:

登录:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Name, ClaimValueTypes.String),
    new Claim(ClaimTypes.Email, user.Email ?? string.Empty, ClaimValueTypes.Email),
    new Claim(ClaimTypes.PrimarySid, user.Id.ToString(), ClaimValueTypes.Integer),
    new Claim(CustomClaimTypes.SalesId, user.SalesId.ToString(), ClaimValueTypes.Integer)
};

var claimsIdentity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(claimsIdentity);

自定义声明:

public static class CustomClaimTypes
{
    public const string SalesId = "SalesId";
}

扩展方法:

public static class IdentityExtensions
{
    public static int GetSalesId(this IIdentity identity)
    {
        ClaimsIdentity claimsIdentity = identity as ClaimsIdentity;
        Claim claim = claimsIdentity?.FindFirst(CustomClaimTypes.SalesId);

        if (claim == null)
            return 0;

        return int.Parse(claim.Value);
    }

    public static string GetName(this IIdentity identity)
    {
        ClaimsIdentity claimsIdentity = identity as ClaimsIdentity;
        Claim claim = claimsIdentity?.FindFirst(ClaimTypes.Name);

        return claim?.Value ?? string.Empty;
    }
}

然后可以这样访问:

User.Identity.GetSalesId();
User.Identity.GetName();

【讨论】:

  • 这很有帮助:)
猜你喜欢
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多