我们希望我们的开发人员能够通过使用 OWIN WS-Federation 中间件在使用 ADFS 进行身份验证的应用程序中调试新代码。但是 WS-fed 身份验证依赖方重定向到开发应用程序服务器,而不是本地 VS 实例。
就组织策略而言,使用大量 localhost 开发人员机器配置 ADFS 依赖方信任是不可行的,因此我只能在调试模式下尝试禁用身份验证。
我已经尝试了以下所有方法来绕过对 ADFS 的 OWIN 中间件调用:
AuthorizeAttribute
在此问题中使用自定义,以便 MVC [Authorize] 属性在DEBUG
模式下选择性地返回错误的“真”。将 MVC 控制器 [Authorize] 包装在条件中,以便它仅在发布代码中激活,如下所示:
namespace eim.Controllers { #if RELEASE [Authorize] #endif public class CoreController : Controller { // GET: Core public ActionResult Index() { return View(); } } }
这里的 RELEASE 编译器常量在 Release Build Configuration 中定义:
在 Startup 类中连接 OWIN 中间件时,Configure 方法进行测试
HttpContext.Current.IsDebuggingEnabled
以选择性地配置 app.AuthenticationOptions,如下面的代码片段所示:public void ConfigureAuth(IAppBuilder app) { if (!HttpContext.Current.IsDebuggingEnabled) { app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType }); var audienceRestriction = new AudienceRestriction(AudienceUriMode.Never); var issuerRegistry = new ConfigurationBasedIssuerNameRegistry(); IDictionary<string, string> trustedIssuers = issuerRegistry.ConfiguredTrustedIssuers; issuerRegistry.AddTrustedIssuer(param1, param2); //Build up Configuration variables before entering the Options //Create a SecurityTokenHandlerConfiguration SecurityTokenHandlerConfiguration ourSecurityTokenHandlerConfiguration = new SecurityTokenHandlerConfiguration() { AudienceRestriction = audienceRestriction, IssuerNameRegistry = issuerRegistry }; //Create an EncryptedSecurityTokenHandlerEx EncryptedSecurityTokenHandlerEx ourEncryptedSecurityTokenHandlerEx = new EncryptedSecurityTokenHandlerEx( new X509CertificateStoreTokenResolver(StoreName.My, StoreLocation.LocalMachine) ); //create a SamlSecurityTokenHandlerEx SamlSecurityTokenHandlerEx ourSamlSecurityTokenHandlerEx = new SamlSecurityTokenHandlerEx { CertificateValidator = X509CertificateValidator.None, Configuration = ourSecurityTokenHandlerConfiguration }; app.UseWsFederationAuthentication( new WsFederationAuthenticationOptions { Wtrealm = realm, //set above from AppSettings MetadataAddress = adfsMetadata, //set above from AppSettings Configuration = new WsFederationConfiguration() { TokenEndpoint = myTokenEndpoint }, TokenValidationParameters = new TokenValidationParameters { AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType, ClientDecryptionTokens = new ReadOnlyCollection<SecurityToken>( new List<SecurityToken> { new X509SecurityToken(ourCertificate) }) }, SecurityTokenHandlers = new SecurityTokenHandlerCollection { ourEncryptedSecurityTokenHandlerEx, ourSamlSecurityTokenHandlerEx } }); }; }
这些方法中的每一个的结果是,无论应用程序处于 DEBUG 还是 RELEASE 中,ADFS 授权都会触发并且回复重定向工作(换句话说,身份验证过程完成)。
让我们通过查看所有中间件配置细节来尽量避免偏离轨道,因为这些细节来自Scott Brady 的 SAML 解密入门指南和Chris Klug 的在这里找到。除了我无法在本地 VS 开发环境的调试模式下禁用它(到目前为止)之外,所有东西都工作正常。