2013-12-13 4 views
2

У меня есть .Net 4.5 MVC4 веб-приложение, работающее с аутентификацией ADFS2. Когда я перехожу на веб-сайт, меня перенаправляют и регистрируют через сервер федерации, эта часть отлично работает.ADFS 2.0 MVC4 Получить информацию о пользователе

Теперь в моем приложении я хочу получить информацию о пользователе. Нашел много страниц, описывающих, как я должен делать это при поиске в Интернете, но я должен что-то пропускать, как бы я ни делал это, я возвращаю пустое/пустое значение.

Я создал контрольный контроллер, который просто распечатывает информацию в двух объектах Claims, которые я нашел в 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" = "" должно содержать имя, которое я поставил в AD.

Любые идеи относительно того, что я делаю неправильно или могу попробовать? Спасибо!

ответ

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; 
     } 
Смежные вопросы