我已经使用Microsoft的“本地”组织帐户身份验证机制创建了一个ASP.Net MVC 5站点。最终将其配置为指向我公司的ADFS基础结构。我找回了所有已配置的声明。但是,在运行时,ClaimsIdentity.Name为空白。这是因为ClaimsIdentity.NameClaimType默认情况下看起来是:

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


但是,我希望我的ClaimsIdentity.Name映射到:

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


根据Microsoft Docs的说法,在web.config中进行设置的位置位于securityTokenHandlers元素的Add元素内:

<system.identityModel>
  <identityConfiguration>
    <securityTokenHandlers>
      <add>
        <samlSecurityTokenRequirement>
          <nameClaimType value=xs:string>
          </nameClaimType>
        </samlSecurityTokenRequirement>
      </add>
    </securityTokenHandlers>
  </identityConfiguration>
</system.identityModel>


在我的ASP.Net MVC 5 web.config中,看起来唯一适用并通过智能感知检查的东西看起来像这样:

<system.identityModel>
  <identityConfiguration>
    <securityTokenHandlers>
      <add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <samlSecurityTokenRequirement>
          <nameClaimType value="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"/>
        </samlSecurityTokenRequirement>
       </add>
      <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </securityTokenHandlers>
  </identityConfiguration>
</system.identityModel>


但是,这似乎没有作用。我的MVC应用仍然报告一个空的ClaimsIdentity.Name字段,并且ClaimsIdentity.NameClaimType仍然是:

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


我的Web.Config应该如何将现有的声明映射到ClaimsIdentity.Name字段?

最佳答案

我发现使用以下securityTokenHandlers部分将我带到需要基于ADFS系统中的SAML 2.0有效负载的地方:

<securityTokenHandlers>
  <add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <remove type="System.IdentityModel.Tokens.Saml2SecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <add type="System.IdentityModel.Tokens.Saml2SecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
    <samlSecurityTokenRequirement>
      <nameClaimType value="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"/>
    </samlSecurityTokenRequirement>
  </add>
</securityTokenHandlers>


由于没有配置Saml令牌处理程序,因此我不确定使用默认的web.config如何使用声明。也许源代码中的某些内容会执行某些默认行为...

07-28 02:44