2013-12-13 74 views
2

我有一個運行ADFS2身份驗證的.Net 4.5 MVC4 web應用程序。當我訪問網站時,我被重定向並通過聯合服務器登錄,這部分工作很好。ADFS 2.0 MVC4獲取用戶信息

現在在我的應用程序中,我想獲取有關用戶的信息。 發現大量的頁面描述我應該如何去做這件事時,谷歌搜索,但我必須失去一些東西,不管我如何做它我得到空白/空值回來。

我創建了一個測試控制器,打印出我在google上找到的兩個聲明對象中的信息。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Script.Serialization; 

namespace Web.Controllers 
{ 
    public class ClaimsController : Controller 
    { 
     public String Index() 
     { 
      System.Security.Claims.ClaimsPrincipal cp = 
       System.Security.Claims.ClaimsPrincipal.Current; 

      Microsoft.IdentityModel.Claims.IClaimsIdentity ci = 
       Thread.CurrentPrincipal.Identity as Microsoft.IdentityModel.Claims.IClaimsIdentity; 

      var o = new 
      { 
       cp_IsAuthenticated = cp.Identity.IsAuthenticated, 
       cp_AuthenticationType = cp.Identity.AuthenticationType, 
       cp_Name = cp.Identity.Name, 
       //cp_Claims = (new JavaScriptSerializer()).Serialize(cp.Claims), // circlular reference 

       ci_IsAuthenticated = ci.IsAuthenticated, 
       ci_Label = ci.Label, 
       ci_Name = ci.Name 
       //ci_Claims = (new JavaScriptSerializer()).Serialize(cp.Claims) // circular reference 
      }; 

      return (new JavaScriptSerializer()).Serialize(o); 
     } 
    } 
} 

這樣做的結果是:

{ 
    "cp_IsAuthenticated":true, 
    "cp_AuthenticationType":"Federation", 
    "cp_Name":null, 

    "ci_IsAuthenticated":true, 
    "ci_Label":null, 
    "ci_Name":null 
} 

我的印象是"Name" = ""應該包含我在廣告設置的名下。

任何想法,我做錯了什麼或可以嘗試? 謝謝!

回答

2

問題在於ADFS服務器未在聯合請求中發回適當的聲明。

一旦索賠被正確設定,這個代碼工作爲獲得的登錄用戶的身份

public string GetIdentityUserEmail() 
     { 
      string result = "[email protected]"; 

      Microsoft.IdentityModel.Claims.IClaimsIdentity ci = 
       Thread.CurrentPrincipal.Identity as Microsoft.IdentityModel.Claims.IClaimsIdentity; 

      if (ci != null && ci.Claims != null) 
      { 
       var accountNameClaim = ci.Claims.Where(x => x.ClaimType.ToLower().EndsWith("windowsaccountname")).FirstOrDefault(); 
       if (accountNameClaim != null) 
        result = accountNameClaim.Value; 
      } 

      return result; 
     }