我按照本页概述的步骤构建了一个声明感知的asp.net mvc应用程序:https://docs.microsoft.com/en-us/dotnet/framework/security/how-to-build-claims-aware-aspnet-mvc-web-app-using-wif。页面中的示例在本地主机上使用STS,但在我的应用程序中,我指向另一台服务器上功能完备的AD FS。
我使用Framework 4.7和Windows Server 2016来托管AD FS并托管Web应用程序。
在部署应用程序后,我针对它运行了Windows Identity Federation Utility(因为我认为我需要它将应用程序添加为AD FS上的依赖方信任)。此实用程序将大量标记插入到引用Microsoft.IdentityModel命名空间的web.config中。
然后我将应用程序作为信赖方信任添加到AD FS,并导航到声明感知应用程序。页面失败,因为示例代码将STS返回的声明强制转换为System.Security.Claims.Claim。当我把它改为演员为Microsoft.IdentityModel.Claims.Claim它工作得很好。
我所遵循的示例未提及Windows Identity Federation Utility。我需要使用它吗?或者没有它会有用吗?
当我尝试反转web.config更改时,实用程序插入站点失败,并显示401错误(由于凭据无效而拒绝访问),因此显然需要实用程序插入的内容才能从AD FS获取身份验证。这是因为我在将网站作为依赖方信任添加到ADFS之前在网站上运行了该工具吗?
答案 0 :(得分:1)
答案是:如果您使用的是ADFS Server 2016,请不要运行Windows Identity Federation Utility,因为它强制使用不推荐使用的Microsoft.Identity库。我错误地认为创建FederationMetadata.xml文件需要此实用程序。
我手动创建了FederationMetadata.xml文件,并将我的web.config恢复为运行该实用程序之前的状态。这使我恢复使用System.Identity库,这些库已添加到4.5框架中,而不是现在已弃用的Microsoft.Identity库。
答案 1 :(得分:1)
只是要注意更多的现代方式"是使用OWIN WS-Federation库。
此示例适用于Azure AD,但您只需指向元数据,代码就会自行计算所有其余内容。