3

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

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

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

  1. AuthorizeAttribute 在此问题中使用自定义,以便 MVC [Authorize] 属性在DEBUG模式下选择性地返回错误的“真”。
  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 类中连接 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 开发环境的调试模式下禁用它(到目前为止)之外,所有东西都工作正常。

4

1 回答 1

2

我发现我自己的问题是:使用自动构建/发布,Conditional Compiler Constant在 Visual Studio 配置 UI 中声明的(CCC)“RELEASE”不可用——即 CCC 不能通过解决方案传输到 VSTS(或者他们可能会这样做)向上转移,但不会被自动构建/发布消耗。)

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

/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\" /p:IgnoreDeployManagerRuntimeVersion=true /p:DefineConstants="发布”

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

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

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

于 2017-09-25T21:50:44.863 回答