实战:ADFS3.0单点登录系列-集成MVC

本文将讲解如何让MVC应用程序与ADFS集成,完成认证的过程。

 

目录:

实战:ADFS3.0单点登录系列-总览

实战:ADFS3.0单点登录系列-前置准备

实战:ADFS3.0单点登录系列-ADFS3.0安装配置

实战:ADFS3.0单点登录系列-集成SharePoint

实战:ADFS3.0单点登录系列-集成MVC

实战:ADFS3.0单点登录系列-集成Exchange

实战:ADFS3.0单点登录系列-自定义ADFS样式

实战:ADFS3.0单点登录系列-问题汇总

 

一.配置ADFS

步骤基本与上一篇相同,只是在添加转换声明规则向导的时候有细微差别,根据实际情况,声明映射有差别,我这里使用upn映射到名称。

在MVC应用程序中,使用httpContext.User.Identity.Name可以获取登录人的信息,当然是xxx@domain.com的形式。关于如何添加其他信息的映射,例如真实姓名等,有需要在后续章节会介绍。

 

二 MVC应用程序中的配置

这里会介绍两种方式(我这里使用的VS2013),两种方法分别适用于不同的场景:

方案一适用于新建的应用程序(前提是已经有了ADFS环境)

方案二适用于已经存在的项目。

 

方案一:自动感知方式

1.打开VS,点击新建项目,并创建MVC应用程序

2.依次点击更改身份验证->组织账户—>本地

在本地颁发机构输入ADFS元数据地址,格式为:

https://{ FQDN}/ FederationMetadata/2007-06/FederationMetadata.xml

例如:https://sts.tt.com/FederationMetadata/2007-06/FederationMetadata.xml

,应用ID Uri可空,待正式部署时进行修改。

 

 点击保存之后,VS会自动将需要的配置(web.config)和DLL进行修改和加载。

 

方案二:手动配置方案

1.<configSections>节点下增加配置项:

<section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 

<section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 

2.<appSettings>节点下增加配置项:

<add key="ida:FederationMetadataLocation" value="https://sts(ADFS地址)/FederationMetadata/2007-06/FederationMetadata.xml" />

<add key="ida:Realm" value="https://xxxxx/(应用程序地址)" />

<add key="ida:AudienceUri" value="https://xxxxx/(应用程序地址)" /> 

3.<system.web>节点下增加和修改配置项:

<authentication mode="None" />

 <authorization>

    <deny users="?" />

  </authorization> 

4.<system.webServer>节点下增加和修改配置项:

<modules>

      <add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 

      <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />

</modules> 

5.</configuration>之前增加配置节

<system.identityModel>

    <identityConfiguration>

      <audienceUris>

        <add value="https://localhost:44300/" />

      </audienceUris>

      <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" />

      </securityTokenHandlers>

      <certificateValidation certificateValidationMode="None" />

      <issuerNameRegistry type="System.IdentityModel.Tokens.ValidatingIssuerNameRegistry, System.IdentityModel.Tokens.ValidatingIssuerNameRegistry">

        <authority name="http://ADFS/adfs/services/trust">

          <keys>

            <add thumbprint="6DBC99C8BFB07435495849EC538E8A54A5587963" />(这里的证书指纹为ADFS令牌签名证书的指纹)

          </keys>

          <validIssuers>

            <add name="http://ADFS/adfs/services/trust" />

          </validIssuers>

        </authority>

      </issuerNameRegistry>

    </identityConfiguration>

</system.identityModel> 

<system.identityModel.services>

    <federationConfiguration>

      <cookieHandler requireSsl="true" />

      <wsFederation passiveRedirectEnabled="true" issuer="https://ADFS/adfs/ls/" realm="https://xxx/" requireHttps="true" />

    </federationConfiguration>

  </system.identityModel.services>

6.dll引用

1)Web项目右键 添加引用 找到system.identityModel和system.identityMoel.services并选择确认

 

2)Nugget方式添加System.IdentityModel.Tokens.ValidatingIssuerNameRegistry

 

这样就手动完成了整个的配置过程。主要是对web.config进行修改的对dll的引用。

 

注意事项:

如果遇到这个错误:

解决方案:

在Global.asax中的 Application_Start()方法中增加如下代码:

AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Name;

意思是告诉MVC,使用的声明类型是 Name。

 

如遇到如下错误:

 Cookie加解密错误,尝试使用ProtectedData API解密Cookie出现错误

解决方案:

这个错误是因为多个应用程序都使用了默认的cookieName,因此只需要将不同应用程序的cookiehandler配置节配置为不同的名称即可。

 

如果遇到如下错误:

解决方案:

这个错误是由于未正确配置指纹导致的,需要使用的是ADFS令牌签名证书的指纹,按如下步骤找到正确的证书指纹即可。

 

posted @ 2016-09-29 13:41  护盾  阅读(5835)  评论(0编辑  收藏  举报