2014-03-07 38 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();