在登陆页面上忽略客户端证书弹出窗口,但仍需要服务证书

时间:2017-11-04 14:59:44

标签: wcf ssl iis clickonce

我在IIS中托管了一个WCF服务,其默认的.aspx文件用作clickonce应用程序的登录页面。 .svc文件和.aspx文件位于应用程序的同一根目录中:即以下文件夹结构:

public class MyThread {

  public static void main(String[] args) {
    final SampleThread sample = new SampleThread();

    Thread th = new Thread(sample);
    th.start();

    Thread th2 = new Thread(sample);
    th2.start();
  }
}


class SampleThread implements Runnable {
  @Override
  public void run() {
    test();
  }

  public synchronized void test() {
    for (int j = 0; j < 10; j++) {
      System.out.println(Thread.currentThread().getId() + "--" + j);
    }
  }
}

如果我浏览MyService并从IIS查看Default.aspx(我的单击登陆页面),我希望提示输入客户端证书,因为客户端证书实际上是从直接单击一次并附加到WCF服务的调用(即MyService -- MyService.svc -- Default.aspx -- Web.config )。

我可以通过将MyService应用程序设置为忽略客户端证书并将MyService.svc设置为接受客户端证书,在IIS管理器中解决此问题。这一切都按预期工作(浏览到Default.aspx并没有提示我,但浏览到.svc确实如此),但是对于部署和放大测试原因,我想在Web.config中自动执行此操作。我试过以下但没有运气。

client.ClientCredentials.ClientCertificate.Certificate = UserCertificate;

<location path="MyService">
<system.webServer>
  <security>
    <access sslFlags="None" />
  </security>
</system.webServer>

我假设将MyService设置为<location path="MyService.svc"> <system.webServer> <security> <access sslFlags="SslRequireCert" /> </security> </system.webServer> ,最初将其搞砸了。

在尝试将我的svc移动到另一个文件夹并将其作为IIS中的子应用程序时,我也遇到了类似的问题。

任何帮助都会很棒,谢谢。

1 个答案:

答案 0 :(得分:0)

我最后通过在我的Advanced Installer项目中添加自定义操作来解决此问题,该项目使用

中的内容将XML配置写入ApplicationHost.config
    using (ServerManager manager = new ServerManager())
        {
            var config = manager.GetApplicationHostConfiguration();

            try
            {
                ConfigurationSection accessSection = config.GetSection("system.webServer/security/access", site);

                if (accessSection != null)
                {
                    Console.WriteLine("Opened app host config successfully.");
                    accessSection["sslFlags"] = @"None";
                }

                accessSection = config.GetSection("system.webServer/security/access", "Default Web Site/MyService/MyService.svc");

                if (accessSection != null)
                {
                    Console.WriteLine("Opened app host config successfully.");
                    accessSection["sslFlags"] = @"Ssl, SslNegotiateCert, SslRequireCert";
                }

                manager.CommitChanges();
                Console.WriteLine("Successfully committed changes");
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Failed to open the app host config.");
            }
        }