Asp.net mvc 4 无法将System.Security.Claims.ClaimsPrincipal类型的对象强制转换为Microsoft.IdentityModel.Claims.IClaimsPrincipal类型

Asp.net mvc 4 无法将System.Security.Claims.ClaimsPrincipal类型的对象强制转换为Microsoft.IdentityModel.Claims.IClaimsPrincipal类型,asp.net-mvc-4,azure,azure-web-roles,Asp.net Mvc 4,Azure,Azure Web Roles,我正在开发一个MVC4应用程序,该应用程序使用ADF对公司域用户进行身份验证,我已经编写了代码,我收到了如下错误,我没有收到索赔吗 System.InvalidCastException:无法将类型为“System.Security.Claims.ClaimsPrincipal”的对象强制转换为类型为“Microsoft.IdentityModel.Claims.IClaimsPrincipal” public ActionResult Index() { try

我正在开发一个MVC4应用程序,该应用程序使用ADF对公司域用户进行身份验证,我已经编写了代码,我收到了如下错误,我没有收到索赔吗

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

您观察到的是混合使用.NET3.5WIF(Microsoft.IdentityModel)和WIF4.0(System.IdentityModel和System.Security)的结果。 我的建议是:

  • 删除对项目中。*程序集的引用
  • 添加对&System.IdentityModel.Services程序集的引用
  • 使用语句修复
  • 修复Web.Config中对Microsoft.IdentityModel的引用

  • 在执行此操作之前,请先备份您的项目,因为如果您以前没有执行过此操作,可能会出现很多错误,并且无法运行代码。但主要的想法是,你必须摆脱所有和任何
    Microsoft.IdentityModel
    引用,你会很好。

    我能够按照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;
                }
            }
    

    通过将foreach循环中的代码从'claim.Type.Contains'更改为'claim.ClaimType.Contains',这对我起到了作用