好的,这花了我几天的时间来解决,但这些是我为了让它运行而做的事情。还有很多事情要做。
先决条件:
- 在您的域中某处运行的 ADFS 2.0 服务。
- 具有自签名证书或可跨域使用的证书的 IIS 7。
- 安装了 Identity and Access(版本 1.0.2)扩展的 Visual Studio 2012。
- 设置为在 IIS 上运行的 MVC4 Web 应用程序。
- 确保将自签名证书添加到站点,以便您可以通过 https 访问它。
- 您可能需要调整计算机的防火墙设置以允许访问您的 ADFS 2.0 服务。
在开发工作站上
在您的 MVC4 项目中
- 右键单击您的 Web 项目,打开身份和访问对话框。
- 选择使用业务身份提供商(例如 ADFS2)
- 输入 STS 元数据文档的路径,例如 https://{PATH TO ADFS SERVER}/FederationMetadata/2007-06/FederationMetadata.xml
- 输入您的应用程序的领域,例如 https://{WEB APPLICATION URL}/
- 尾部的斜线会有所不同。
- 通过接受这些更改退出对话框。
将以下代码添加到您的项目中
using System;
using System.IdentityModel.Services;
namespace NAMESPACE
{
public class FixedWsFederationAuthenticationModule : WSFederationAuthenticationModule
{
public override void RedirectToIdentityProvider(string uniqueId, string returnUrl, bool persist)
{
//This corrects WIF error ID3206 "A SignInResponse message may only redirect within the current web application:"
//First Check if the request url doesn't end with a "/"
if (!returnUrl.EndsWith("/"))
{
//Compare if Request Url +"/" is equal to the Realm, so only root access is corrected
//https://localhost/AppName plus "/" is equal to https://localhost/AppName/
//This is to avoid MVC urls
if (String.Compare(System.Web.HttpContext.Current.Request.Url.AbsoluteUri + "/", base.Realm, StringComparison.InvariantCultureIgnoreCase) == 0)
{
//Add the trailing slash
returnUrl += "/";
}
}
base.RedirectToIdentityProvider(uniqueId, returnUrl, persist);
}
}
}
在 ADFS 2.0 服务器上
- 如果您使用自签名证书,请导航到您的 Web 应用程序 https://{WEB APPLICATION URL}/ 并将区域更改为受信任的站点。
- 在浏览器的地址栏中,您应该可以右键单击证书并安装(您只能从受信任的站点安装证书)证书需要安装在 Trusted Root Authorities -> Registry 下,
- 打开 ADFS 控制台,添加依赖方信任,联合元数据地址 https://{WEB APPLICATION URL}/FederationMetadata/2007-06/FederationMetadata.xml
添加一些自定义规则
MVC4 需要这些规则才能生成可用的 ClaimsPrincipal
在 Name 属性上添加传递规则。
而这 2 个自定义规则
=> issue(Type = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", Value = "true");
=> issue(Type = "http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", Value = "true");