【问题标题】:Bypassing OWIN WS-Federation Authentication in DEBUG mode在 DEBUG 模式下绕过 OWIN WS-Federation 身份验证
【发布时间】:2017-09-20 16:56:16
【问题描述】:

我们希望我们的开发人员能够通过使用 OWIN WS-Federation 中间件在使用 ADFS 进行身份验证的应用程序中调试新代码。但是 WS-fed 身份验证依赖方重定向到开发应用程序服务器,而不是本地 VS 实例。

就组织策略而言,使用大量 localhost 开发人员机器配置 ADFS 依赖方信任是不可行的,因此我只能在调试模式下尝试禁用身份验证。

我已经尝试了以下所有方法来绕过对 ADFS 的 OWIN 中间件调用:

  1. 使用自定义 AuthorizeAttribute as in this question 以便 MVC [Authorize] 属性在 DEBUG 模式下选择性地返回 false 'true'。
  2. 将 MVC 控制器 [Authorize] 包装在条件中,使其仅在发布代码中激活,如下所示:

    namespace eim.Controllers
    {
        #if RELEASE
        [Authorize]
        #endif
    public class CoreController : Controller
    {
        // GET: Core
        public ActionResult Index()
        {
            return View();
        }
    }  }
    

这里的 RELEASE 编译器常量在 Release Build Configuration 中定义:

  1. 在 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


    【解决方案1】:

    我发现我自己的问题是:使用自动构建/发布,Conditional Compiler Constant (CCC) 在 Visual Studio 配置 UI 中声明了“RELEASE”。不可用 - 即 CCC 不会随解决方案迁移到 VSTS(或者它们可能会迁移,但不会被自动构建/发布消耗。)

    因此,在我的构建步骤中,我不得不使用以下语法重新定义 CCC“RELEASE”:

    /p:DeployOnBuild=true /p:WebPublishMethod=包 /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\" /p:IgnoreDeployManagerRuntimeVersion=true /p:DefineConstants="RELEASE"

    当然只有最后一个参数是CCC定义。

    请记住,我对 CCC 常量名称“RELEASE”的选择是任意的,可以是“FOO”或“SERVER”或任何其他有用的常量名称。

    一旦到位,上面的选项 #2 在 localhost 和已部署的版本中都可以正常工作。

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 2017-01-29
      • 2016-08-02
      • 2015-04-29
      • 1970-01-01
      • 2015-09-23
      • 2023-04-05
      • 1970-01-01
      • 2014-12-20
      相关资源
      最近更新 更多