我有一个使用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中设置的名称。
关于我做错了什么或者可以尝试的任何想法? 谢谢!
答案 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;
}