ADFS 2.0 MVC4获取用户信息

时间:2013-12-13 13:26:38

标签: c#-4.0 adfs2.0

我有一个使用ADFS2身份验证运行的.Net 4.5 MVC4 Web应用程序。当我进入网站时,我被重定向并通过联合服务器登录,这部分工作得很好。

现在在我的应用程序中,我想获得有关用户的信息。 找到了很多页面描述了我在google搜索时应该怎么做,但我必须遗漏一些东西,因为无论我怎么做,我都会得到空白/空值。

我创建了一个测试控制器,只打印出我在google上找到的两个Claim对象中的信息。

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中设置的名称。

关于我做错了什么或者可以尝试的任何想法? 谢谢!

1 个答案:

答案 0 :(得分:2)

问题是ADFS服务器没有在联合请求中发回适当的声明。

一旦声明设置正确,此代码可用于获取登录用户的身份

public string GetIdentityUserEmail()
{
    string result = "default.identity@domain.com";

    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;
}