【问题标题】:Unable to cast object of type System.Security.Claims.ClaimsPrincipal to type Microsoft.IdentityModel.Claims.IClaimsPrincipal无法将 System.Security.Claims.ClaimsPrincipal 类型的对象转换为 Microsoft.IdentityModel.Claims.IClaimsPrincipal 类型
【发布时间】:2014-03-10 15:49:07
【问题描述】:

我正在开发一个 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();
    }

【问题讨论】:

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


    【解决方案1】:

    您观察到的是混合 .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 的引用

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

    【讨论】:

      【解决方案2】:

      我能够按照 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”,这对我有用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      相关资源
      最近更新 更多