WIF应用与ADFS 2.0配置实战(续):实现SSO

上一篇已经建立了Application和ADFS之间的信任关系,单点登录就已经是水到渠成的事情了。接下来把原来的站点复制一份来测试一下:

1.新建站点,并在站点下指定了虚拟目录(应用程序 in IIS 7.5)到复制的那份代码

2.配置SSL。原来采用的证书不是带星号的,这里重新创建一个自签名的证书,采用*.xxx.com的名称。关于这个,可以看看这里:http://forums.iis.net/t/1117559.aspx

3.修改原来的站点关联的证书为新建的这个。改后发现原来是disable的主机头变成enable了。

4.新站点绑定到HTTPS,采用新证书,设置不同的主机头。

5.同样,在DNS中注册新的主机

6.这个时候尝试访问新站点,报了一个异常:

源错误: 
执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。  
堆栈跟踪: 

[CryptographicException: 系统找不到指定的文件。]   System.Security.Cryptography.ProtectedData.Protect(Byte[] userData, Byte[] optionalEntropy, DataProtectionScope scope) +681   Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Encode(Byte[] value) +121
[InvalidOperationException: ID1074: 尝试使用 ProtectedData API 加密 Cookie 时发生了 CryptographicException (有关详细信息,请参阅内部异常)。如果正在使用 IIS 7.5,则这可能是应用程序池的 loadUserProfile 设置为 false 所致。]   Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Encode(Byte[] value) +1280740   Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ApplyTransforms(Byte[] cookie, Boolean outbound) +74   Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.WriteToken(XmlWriter writer, SecurityToken token) +571   Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.WriteToken(SessionSecurityToken sessionToken) +103   Microsoft.IdentityModel.Web.SessionAuthenticationModule.WriteSessionTokenToCookie(SessionSecurityToken sessionToken) +136   Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.SignInWithResponseMessage(HttpRequest request) +639   Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs args) +1099462   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +171

这样的异常信息真的是非常的programmer friendly,它连怎么解决都告诉你了。照做,异常消失。

7.系统页面能呈现了,但是,咦,为什么从ADFS验证完毕后又跳转到原来的站点了?哦,当然啦,我们adfs还没配。所以首先:

修改应用的配置文件,改web.config中的audienceUris和wsFederation中的realm为新的地址。另外,还应该修改FederationMetadata.xml中的<Address>节点。不过既然我们adfs中采用的是手动配置,而没有读取这个文件,其实这个文件修改与否应该没什么关系。

然后去到ADFS,用同样的方式建立一个信赖方。

再试,正常了!

8.测试。先用域用户测试,没有问题。用本机账户登录(而非域用户),弹出域验证输入框后,输入用户名密码后要勾选保存用户名和密码,关闭浏览器后再打开并访问系统才不会再次弹出域验证输入框。

原文地址:https://www.cnblogs.com/damnedmoon/p/1990020.html