【问题标题】:iFrame suppress authentication popup for https when parent window is already authenticated当父窗口已通过身份验证时,iFrame 会抑制 https 的身份验证弹出窗口
【发布时间】:2010-03-31 19:45:23
【问题描述】:

我为通过 HTTPS 运行的 Intranet 应用程序开发了一种打印机制。使用 javascript 和 jQuery,我在页面中创建了一个 iframe,并用所有应该打印的动态数据填充它。

iframe 有一个/MyController/Print 的来源,它只返回一个空白的虚拟页面。然后将其替换为动态内容。我这样做是为了避免打印输出上的页面位置为“about:blank”,并获得有关某些安全内容、某些不安全内容的弹出窗口。

这在本地工作得很好,但是一旦它在 https 服务器上,我在尝试创建 iframe 时会弹出一个域身份验证弹出窗口。它询问我的用户名和密码(尽管主应用程序从来没有这样做过——它使用内部网络来识别用户)。

有什么方法可以抑制用户/密码弹出窗口吗?

【问题讨论】:

    标签: javascript jquery asp.net-mvc authentication iframe


    【解决方案1】:

    在这种情况下使用 iframe 通常会产生 x 域安全问题。

    这个问题是根据Same Origin Policy发生的

    因此,针对此问题的推荐解决方法是供您使用

    <style media="print">
       css properties to modify the page for print
    </style>
    

    【讨论】:

    • 谢谢...这就是我试图避免的。我的另一个选择是将 src 定义为“javascript:false;”那行得通。我只是希望在打印输出中使用更友好的 URL。还有其他想法吗?
    • 虽然这在技术上不能回答问题,但我会选择“对此没有明确的答案”。此外,您的回复启发了我以不同的方式对打印功能进行编码,其中包括用于打印的 CSS。因此,即使我无法让它 100% 完全按照我想要的方式工作,这也很好。谢谢!
    【解决方案2】:

    这实际上来自另一个帖子,但我真的很喜欢这个解决方案。

    您可以设置您的动作控制器以将您的可打印数据编写为 pdf

    public FileStreamResult Print(int id)
    
    
    {
         var model = _CustomRepository.Get(id);
         this.ConvertToPDF = true;
         return View( "HtmlView" );
     }
    
     public override OnResultExecuting( ResultExecutingContext context )
     {
          if (this.ConvertToPDF)
          {
              this.PDFStream = new MemoryStream();
              context.HttpContext.Response.Filter = new PDFStreamFilter( this.PDFStream );
          }
     }
    
     public override OnResultExecuted( ResultExecutedContext context )
     {
          if (this.ConvertToPDF)
          {
              context.HttpContext.Response.Clear();
              this.PDFStream.Seek( 0, SeekOrigin.Begin );
              Stream byteStream = _PrintService.PrintToPDF( this.PDFStream );
              StreamReader reader = new StreamReader( byteStream );
              context.HttpContext.Response.AddHeader( "content-dispostion",
                     "attachemnt; filename=report.pdf" );
              context.HttpContext.Response.AddHeader( "content-type",
                     "application/pdf" );
              context.HttpContext.Response.Write( reader.ReadToEnd() );
          }
    }
    

    我假设您使用的是 .net mvc。我希望我没有错

    【讨论】:

    • 这真的很酷。虽然它不适用于我现在正在做的事情,但我将来可能会回到这个。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 2020-08-28
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    相关资源
    最近更新 更多