2014-03-07 118 views
23

我在我的应用程序中使用了OWIN身份验证。在MVC中访问控制器中的声明值5

登录行动

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; 

enter image description here

我可以查看快速窗口内的值。但即使我无法访问价值。如何获得价值?

回答

46

你需要设置你的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(); 
+0

我仍然没有得到答案。你能否检查上述问题中的更新?我已经描述了这个问题。 – Golda

+0

@Golda嗨,开放调试窗口应该看看索赔中的内容,你可以打开这个窗口吗? – hutchonoid

+0

@戈尔达挂上,得到它给我2分钟更新问题。 – hutchonoid

10

下面是另一个例子,与自定义声明类型以及:

登录:

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