【问题标题】:User's Claims Identity用户声明身份
【发布时间】:2016-02-19 09:58:24
【问题描述】:

目前有两种登录方式。一种是通过活动目录,我可以获取用户的声明身份。

第二个是通过自定义注册表单,即使我可以使用以下代码获取用户的索赔信息:

foreach (Microsoft.IdentityModel.Claims.Claim claim in identity.Claims)
{
    Console.Write("Type: " + claim.type);
}

输出:

claimtype=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
value=test@mail.com

我遇到的问题是,我正在尝试获取自定义寄存器声明的值,然后使用下面的代码将其保存到用户表中,但是没有运气

var myemail = identity.Claims.First(c => c.ClaimType == "EmailAddress").Value;

错误提示:

“序列不包含任何元素”

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4 wif


    【解决方案1】:

    声明类型是

    http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
    

    不是EmailAddress。如果不想重复整个类型,请使用ClaimTypes.Email

    var myemail = identity.Claims.First(c => c.ClaimType == ClaimTypes.Email).Value
    

    您的错误表明没有EmailAddress 类型的声明,这是正确的。然后你尝试获取空集合的第一个元素,你会得到实际的异常。

    【讨论】:

    • 是的,我也尝试过,但屏幕上没有任何显示,好像整个声明类型不存在一样。这只是“自定义用户注册表单”中的一个错误,就好像它无法识别索赔或自定义登录表单被区别对待?他们是吗?奇怪的是,当我循环整个claims.claim时,我可以看到所有的索赔信息
    • @Menew:我不知道,因为您没有提供有关此自定义表单的足够详细信息。该答案解决了您在问题中提出的特定问题。我想如果这个正确的答案导致其他问题,你应该接受这个答案,但创建另一个问题,其中包含有关你的自定义表单的详细信息以及你如何在那里泄露声明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2018-07-30
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2016-07-31
    相关资源
    最近更新 更多