无法转换System.Security.Claims.ClaimsPrincipal类型的对象以键入Microsoft.IdentityModel.Claims.IClaimsPrincipal

时间:2014-03-10 15:49:07

标签: asp.net-mvc-4 azure azure-web-roles

我正在开发一个MVC4应用程序,它使用ADFS对corp域用户进行身份验证,我编写了代码,我收到的错误如下,我没有得到索赔?

System.InvalidCastException:无法将类型为“System.Security.Claims.ClaimsPrincipal”的对象强制转换为“Microsoft.IdentityModel.Claims.IClaimsPrincipal”。

    public ActionResult Index()
    {
        try
        {

            IClaimsPrincipal principal = (IClaimsPrincipal)Thread.CurrentPrincipal;
            IClaimsIdentity identity = (IClaimsIdentity)principal.Identity;
            if (String.IsNullOrEmpty(identity.Claims[0].Value.Split('@')[0]))
            {
                ViewData["Message"] = string.Format("You are email is :{0}", identity.Claims[0].Value.Split('@')[0]);

            }
            else
            {
                ViewData["Message"] = "You are not getting any claims";
            }
        }
        catch (Exception ex)
        {
            ViewData["Message"] = "Something wrong.";
        }
        return View();
    }

2 个答案:

答案 0 :(得分:9)

您观察到的是混合使用.NET 3.5 WIF(Microsoft.IdentityModel)和WIF 4.0(System.IdentityModel& System.Security)。 我的建议是:

  1. 删除对项目中Microsoft.IdentityModel。*程序集的引用
  2. 添加对System.IdentityModel&的引用System.IdentityModel.Services程序集
  3. 修复使用陈述
  4. 修复Web.Config中对Microsoft.IdentityModel的引用
  5. 在执行此操作之前,请执行项目的备份副本,因为如果您之前没有这样做过,那么最终可能会出现很多错误,而不会运行代码。但主要的想法是你必须摆脱所有Microsoft.IdentityModel引用,你会很好。

答案 1 :(得分:1)

我能够按照astaykov的建议解决这个问题,我改变了下面的代码,

using System.Security.Claims;
var identity = User.Identity as ClaimsIdentity;         

        foreach (var claim in identity.Claims)
        {
            if (claim.Type.Contains("EmailAddress"))
            {
                ViewBag.EmailName = claim.Value;
            }
        }