【问题标题】:ADFS 2.0 MVC4 Get user informationADFS 2.0 MVC4 获取用户信息
【发布时间】:2013-12-13 13:26:38
【问题描述】:

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

现在在我的应用程序中,我想获取有关用户的信息。 发现很多页面描述了我在谷歌搜索时应该如何做这件事,但我一定错过了一些东西,因为无论我怎么做,我都会得到空白/空值。

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

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

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

【问题讨论】:

    标签: c#-4.0 adfs2.0


    【解决方案1】:

    问题在于 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 2012-12-10
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多