【发布时间】:2017-09-20 16:56:16
【问题描述】:
我们希望我们的开发人员能够通过使用 OWIN WS-Federation 中间件在使用 ADFS 进行身份验证的应用程序中调试新代码。但是 WS-fed 身份验证依赖方重定向到开发应用程序服务器,而不是本地 VS 实例。
就组织策略而言,使用大量 localhost 开发人员机器配置 ADFS 依赖方信任是不可行的,因此我只能在调试模式下尝试禁用身份验证。
我已经尝试了以下所有方法来绕过对 ADFS 的 OWIN 中间件调用:
- 使用自定义
AuthorizeAttributeas in this question 以便 MVC [Authorize] 属性在DEBUG模式下选择性地返回 false 'true'。 -
将 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 类的 Configure 方法中连接 OWIN 中间件时,测试
HttpContext.Current.IsDebuggingEnabled以选择性地配置 app.AuthenticationOptions,如下代码 sn-p: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's SAML decription primer 这里和Chris Klug's found here。除了我无法在本地 VS 开发环境的调试模式下禁用它(到目前为止)之外,所有东西都可以正常工作。
【问题讨论】:
标签: asp.net-mvc authentication owin ws-federation wsfederationhttpbinding