SQL Server Reporting Services 匿名登录的问题及解决方案

每次访问报表都需要windows验证,这样的报表给客户确实很说不过去.

SSRS 可以匿名登录的设定步骤:

环境:

  开发工具:SQL Server Business Intelligence Development Studio

  数据库: SQL2008

首先确定你的Reporting Services 目录位置

默认为:C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer

打开目录会修改该目录下的3个配置文件,分别为:rsreportserver.config ,rssrvpolicy.config ,web.config

解决步骤:

  1.打开rsreportserver.config

   修改Configuration/Authentication/AuthenticationTypes

   修改前:

<Authentication>
    <AuthenticationTypes>
        <RSWindowsNTLM/>
    </AuthenticationTypes>
</Authentication>

修改后:

<Authentication>
    <AuthenticationTypes>
        <Custom/>
    </AuthenticationTypes>
</Authentication>

2. 修改web.config

<!--节点:configuration/system.web/authentication -->

<!-- 修改前 -->
<authentication mode="Windows" />
<identity impersonate="true" />
<!-- 修改后 -->
<authentication mode="None" />
<identity impersonate="false" />

3. 从微软下载匿名登录的范例项目
( 下载网址 http://blog.quasarinc.com/wp-content/uploads/2012/03/Microsoft.Samples.ReportingServices.AnonymousSecurity.zip),
并且重新编译出一个新的 Microsoft.Samples.ReportingServices.AnonymousSecurity.dll 动态库,
范例为2010解决方案,其实里面用到的只是class1.cs文件,还有项目名称不能变,和我们下面配置有直接关系.

打开解决方案 将 Microsoft.ReportingServices.Interfaces.dll 的引用移除,并添加本地服务器的这个文件,位置在 ..\Reporting Services\ReportServer\bin 下, (注意别把这个dll当成万能的)

重新编译会生成 :Microsoft.Samples.ReportingServices.AnonymousSecurity.dll 将该文件放置bin目录下

4.再次修改rsreportserver.config

<!--修改节点:Configuration/Extensions/Security/Extension -->
<!-- 修改前 -->
<Security>
    <Extension Name="Windows" Type="Microsoft.ReportingServices.Authorization.WindowsAuthorization, Microsoft.ReportingServices.Authorization" />
</Security>
<Authentication>
    <Extension Name="Windows" Type="Microsoft.ReportingServices.Authentication.WindowsAuthentication, Microsoft.ReportingServices.Authorization" />
</Authentication>

<!-- 修改后 -->
<Security>
  <Extension Name="None" Type="Microsoft.Samples.ReportingServices.AnonymousSecurity.Authorization, Microsoft.Samples.ReportingServices.AnonymousSecurity" />
</Security>
<Authentication>
  <Extension Name="None" Type="Microsoft.Samples.ReportingServices.AnonymousSecurity.AuthenticationExtension, Microsoft.Samples.ReportingServices.AnonymousSecurity" />
</Authentication>

5. 在 rssrvpolicy.config 内新增一个节点

<!-- 要增加的节点 configuration/mscorlib/security/PolicyLevel 之下 -->

<CodeGroup
        class="UnionCodeGroup"
        version="1"
        PermissionSetName="FullTrust"
        Name="Private_assembly"
        Description="This code group grants custom code full trust. ">
  <IMembershipCondition
          class="UrlMembershipCondition"
          version="1"
          Url="C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer\bin\Microsoft.Samples.ReportingServices.AnonymousSecurity.dll"
                  />
</CodeGroup>

注意:这个Url,路径是reporting services 目录下新编译的文件,不同数据库版本,或安装目录不同,会有差异

6. 重新启动 Reporting Services

完美解决,历时半个月,这个问题终于告以段落,以后可以专心设计报表了.

以上解决方案参考于msdn上的一篇文章,做了些整理.

由于是程序员,所有手工做的事还是交给程序做,以上5个步骤,已使用程序实现:

起个名字叫:ssrs_onekey_nologin 全称:sql server report serveics 一键匿名登录配置.

主要功能,修改xml ,自己生成dll,copy至 bin目录下.

使用说明:需录入report services 目录

代码共享:

 class Program
       {
           static void Main(string[] args)
           {
               Console.WriteLine("请输入Reporting Services目录:为空则与c盘默认sql2008");
               string a = Console.ReadLine();

               string basePath;
              if (string.IsNullOrEmpty(a))
              {
                 basePath = @"c:\Program Files\Microsoft SQL Server\MSRS10.MSSQLSERVER\Reporting Services\ReportServer";
              }else
             {
                 basePath = a;
              }

             Console.WriteLine("Reporting Services 目录为:{0}", basePath);
             Console.WriteLine("确认请按任意键...");
             Console.ReadKey();

             string bakPath = @"c:\SSRS_noLogin_bak\" + DateTime.Now.ToString("yyyyMMddHHmmss");
            Directory.CreateDirectory(bakPath);
            File.Copy(basePath + "\\rsreportserver.config", bakPath + "\\rsreportserver.config");
            File.Copy(basePath + "\\web.config", bakPath + "\\web.config");
             File.Copy(basePath + "\\rssrvpolicy.config", bakPath + "\\rssrvpolicy.config");

            Console.WriteLine("第1步开始:");
            Step1(basePath);
            Console.WriteLine("第1步结束.");

            Console.WriteLine("第2步开始:");
            Step2(basePath);
            Console.WriteLine("第2步结束.");

             Console.WriteLine("第3步开始:");
             Step3(basePath);
            Console.WriteLine("第3步结束.");

            Console.WriteLine("第4步开始:");
             Step4(basePath);
             Console.WriteLine("第4步结束.");

            Console.WriteLine("第5步开始:");
             Step5(basePath);
             Console.WriteLine("第5步结束.");

             Console.WriteLine("完成");
           Console.ReadKey();
         }

         static void Step1(string basePath)
         {
             string file = basePath + "\\rsreportserver.config";
             XmlDocument doc = new XmlDocument();
             doc.Load(file);                  //Configuration
             XmlNode xn = doc.SelectSingleNode("Configuration/Authentication/AuthenticationTypes");
             XmlNode oldXn = xn.SelectSingleNode("RSWindowsNTLM");
             if (oldXn == null)
             {
                 Console.WriteLine("未找到RSWindowsNTLM,或已更改");
            }
            else
           {
                XmlNode newXn = doc.CreateElement("Custom");
                xn.ReplaceChild(newXn, oldXn);
             }
              doc.Save(file);

         }
        static void Step2(string basePath)
         {
             XmlDocument doc = new XmlDocument();
             string file = basePath + "\\web.config";
             doc.Load(file);
            XmlNode xn2 = doc.SelectSingleNode("configuration/system.web/authentication");
             XmlElement xm2 = (XmlElement)xn2;
              xm2.SetAttribute("mode", "None");

            XmlNode xn3 = doc.SelectSingleNode("configuration/system.web/identity");
           XmlElement xm3 = (XmlElement)xn3;
            xm3.SetAttribute("impersonate", "false");

            doc.Save(file);
        }
          static void Step3(string basePath)
          {
            CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
             CompilerParameters objCompilerParameters = new CompilerParameters();
             objCompilerParameters.ReferencedAssemblies.Add("System.dll");
             objCompilerParameters.ReferencedAssemblies.Add(basePath + @"\bin\Microsoft.ReportingServices.Interfaces.dll");
             string strSourceCode = Resources.Class1;
             objCompilerParameters.GenerateInMemory = false;
            objCompilerParameters.OutputAssembly = "Microsoft.Samples.ReportingServices.AnonymousSecurity.dll";
            CompilerResults cr = objCSharpCodePrivoder.CompileAssemblyFromSource(objCompilerParameters, strSourceCode);
             if (cr.Errors.HasErrors)
            {
                 string strErrorMsg = cr.Errors.Count.ToString() + " Errors:";
                 for (int x = 0; x < cr.Errors.Count; x++)
                 {
                    strErrorMsg = strErrorMsg + "/r/nLine: " +
                                 cr.Errors[x].Line.ToString() + " - " +
                                  cr.Errors[x].ErrorText;
                 }
                 Console.WriteLine(strErrorMsg);
                 return;
            }
             File.Copy("Microsoft.Samples.ReportingServices.AnonymousSecurity.dll", basePath + @"\bin\Microsoft.Samples.ReportingServices.AnonymousSecurity.dll", true);
             File.Delete("Microsoft.Samples.ReportingServices.AnonymousSecurity.dll");
         }
         static void Step4(string basePath)
        {
             XmlDocument doc = new XmlDocument();
             string file = basePath + "\\rsreportserver.config";
            doc.Load(file);
             XmlNode xn2 = doc.SelectSingleNode("Configuration/Extensions/Security/Extension");
            XmlElement xm2 = (XmlElement)xn2;
             xm2.SetAttribute("Name", "None");
             xm2.SetAttribute("Type", "Microsoft.Samples.ReportingServices.AnonymousSecurity.Authorization, Microsoft.Samples.ReportingServices.AnonymousSecurity");

            XmlNode xn3 = doc.SelectSingleNode("Configuration/Extensions/Authentication/Extension");
            XmlElement xm3 = (XmlElement)xn3;
            xm3.SetAttribute("Name", "None");
            xm3.SetAttribute("Type", "Microsoft.Samples.ReportingServices.AnonymousSecurity.AuthenticationExtension, Microsoft.Samples.ReportingServices.AnonymousSecurity");

             doc.Save(file);
         }

         static void Step5(string basePath)
        {
            XmlDocument doc = new XmlDocument();
             string file = basePath + "\\rssrvpolicy.config";
             doc.Load(file);
            XmlNode xn1 = doc.SelectSingleNode("configuration/mscorlib/security/PolicyLevel/CodeGroup[@class=UnionCodeGroup]");
            if (xn1 != null)
            {
                //已添加
            }
           else
             {
                 XmlNode xn = doc.SelectSingleNode("configuration/mscorlib/security/policy/PolicyLevel");
                 XmlElement xe = doc.CreateElement("CodeGroup");
                xe.SetAttribute("class", "UnionCodeGroup");
                 xe.SetAttribute("version", "1");
                 xe.SetAttribute("PermissionSetName", "FullTrust");
                 xe.SetAttribute("Name", "Private_assembly");
                xe.SetAttribute("Description", "This code group grants custom code full trust.");

                 XmlElement xe2 = doc.CreateElement("IMembershipCondition");
                 xe2.SetAttribute("class", "UrlMembershipCondition");
                 xe2.SetAttribute("version", "1");
                xe2.SetAttribute("Url", basePath + @"\bin\Microsoft.Samples.ReportingServices.AnonymousSecurity.dll");

                 xe.AppendChild(xe2);
                xn.AppendChild(xe);
           }
            doc.Save(file);
        }

     }
 }
ssrs onkey no login

程序共享:

下载

解决后测试页的展示:

到此这篇关于关于 SQL Server Reporting Services 匿名登录的解决方案的文章就介绍到这了,更多相关SQL Server Reporting Services内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SQL Server 2008+ Reporting Services (SSRS)使用USER登录问题

    我的数据库和报表服务的版本如下: 数据库:SQL Server 2008 R2 报表服务:SQL Server 2008 R2 Reporting Services 我本想让用户像访问网站一样访问我的报表服务,该死的SQL Server Reporting Services从2005以后就不依赖于IIS,造成用户不能匿名访问了. 网上有关于"SQL Server 2008 Reporting Services匿名访问"的教程,通过修改Reporting Services下的配置文件来实

  • sql server连接不上怎么办 SQL Server2008R无法登录的解决方案(1814\18456)

    早上一开电脑,黑屏幕跑一些修复系统的代码....进入系统后,sql server连接不上 正文 原因:sql server的服务自动关闭了,并且启动失败 windows日志信息:传递给数据库 'master' 中的日志扫描操作的日志扫描号 (286:456:1) 无效.此错误可能指示数据损坏,或者日志文件(.ldf)与数据文件(.mdf)不匹配.如果此错误是在复制期间出现的,请重新创建发布.否则,如果该问题导致启动期间出错,请从备份还原. 很明显是sqlserver的系统文件出了问题,先百度,网

  • SQLServer无法打开用户默认数据库 登录失败错误4064的解决方法

    无法打开用户默认数据库,登录失败,其原因是登录帐户的默认数据库被删除. 解决办法是使用管理员帐户修改此登录帐户的默认数据库. 1.使用管理员帐号登入企业管理器,在"对象资源管理器"中,展开"安全性"--"登录名",右键该帐户点击"属性" 2.在"登录属性"的对话框中,第一个"常规"选项卡界面的右边更改默认的数据库. 如果出问题的就是你的管理员帐户,你无法登入企业管理器里修改,可以使用以下

  • SQL Server Reporting Services 匿名登录的问题及解决方案

    每次访问报表都需要windows验证,这样的报表给客户确实很说不过去. SSRS 可以匿名登录的设定步骤: 环境: 开发工具:SQL Server Business Intelligence Development Studio 数据库: SQL2008 首先确定你的Reporting Services 目录位置 默认为:C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer

  • win2008下安装SQL SERVER 2005出现IIS功能要求 警告解决方案

    您会收到 SQL Server 2005 安装程序正在运行 Windows Vista 的计算机上的系统配置检查页或 Windows Server 2008 的一个服务器核心安装上一条警告消息 症状: 请考虑以下情形.您安装 Microsoft SQL Server 2005 或 Microsoft SQL Server 2005 速成版通过高级服务正在运行下列操作系统之一的计算机上:•Windows Server 2008 操作系统 •Windows Vista 操作系统 在这种情况下您会收到

  • SQL Server 2005数据库还原错误的经典解决方案

    在SQL Server 2005数据库还原的过程中出现错误:备份集中的数据库备份与现有的'xxxx'数据库不同,网上找了几个解决方案测试,最终成功还原,特此记录下,提供给需要的人. 第一步: 如果你知道备份数据库名你可以跳过第一步,如果你不知道备份数据库的名称,你可以先执行下面语句: RESTORE FILELISTONLY From disk = 'F:\路径\css_cms1'--备份数据库文件路径名 这样可以列出该文件里的data和log文件名,知道这两个文件名以后可以执行下一步了. 第二

  • SQL Server索引超出了数组界限的解决方案

    有开发的同事反映远程登录SQL Server操作报错,索引超出了数组界限等 如下图 线上数据库版本为SQL Server2012 R2,检查后发现开发人员SSMS版本为2008,版本与服务器不一致,(开发人员要求登录数据库服务器操作,果断拒绝了)建议在本地打上SP3或者直接安装2012的SSMS,安装好后问题解决. 补充:SQL–"索引超出了数组界限" 一般是由于使用的客户端版本低于数据库版本引起的 如果没有多个SQL版本的话 可以尝试的解决办法: 1.重启电脑,再试试 2.重装SQL

  • 安装sql server 2008时的4个常见错误和解决方法

    可能由于操作系统不同,或者在安装SQL 2008的时候已经安装SQL其他版本,因此可能会遇到问题,那么这时我们的实际经验和动手测试的能力也是非常重要的,这样才能少走弯路. 问题1:安装sql server 2008 R2,安装过程中提示错误:此计算机上安装了 Microsoft Visual Studio 2008 的早期版本.请在安装 SQL Server 2008 前将 Microsoft Visual Studio 2008 升级到 SP1. 之前我的电脑上确实装了vs2008,于是我准

  • SQL Server 2005降级到2000的正确操作步骤分享

    以下的文章主要向大家描述的是SQL Server 2005导入到SQL Server 2000的正确操作步骤,以及对其在实际操作中值得我们大家注意的相关事项的具体描述,以下就是文章的具体内容的介绍,望你会有所收获. SQL Server 2005转到2000的步骤: 1. 生成for SQL Server 2000版本的数据库脚本 SQL Server 2005 的manger studio 打开"对象资源管理器"(没有的话按F8), 连接到你的实例 右键要转到SQL Server 2

  • SQL Server 2016 CTP2.3 的关键特性总结

    SQL Server 2016带来全新突破性的  in-memory性能和分析功能来实现关键任务处理.全面的安全特性 -Always Encrypted 技术可以帮助保护您的数据 数据库方面的增强 Row Level Security已经支持In-memory OLTP 表.用户现在可以对内存优化表实施row-level security策略. 另外SCHEMABINDING.predicate 函数和内联表值函数都要包含NATIVE_COMPILATION编译选项. 使用NATIVE_COMP

  • 在WIN7下安装和配置SQL Server 2005 Express Edition(精简版)

    折腾了一下午,终于把SQL Server 2005 Express Edition装好,鉴于出现了各种问题,所以把过程写下来. 首先,下载两个文件: ①SQL Server 2005 Express Edition 下载地址:http://files.jb51.net/file_images/article/201501/2015010313472645.aspx ②SQLServer2005_SSMSEE.msi 下载地址:http://files.jb51.net/file_images/a

  • SQL Server数据库复制失败的原因及解决方法

    在SQL Server数据库操作中,对数据库复制时出现了以下的错误,错误信息如下图所示: SQL Server数据库复制失败的原因及解决方案 出现上面的提示信息,会是什么原因导致的呢?笔者经过一番推敲终于找到了上述的原因. 原因:在复制数据库时,必须先停止mssqlserver服务,然后才能复制. 解决方法: 开始-->运行-->services.msc打开服务管理器,找到mssqlserver服务,然后停止该服务. 或者 开始-->运行-->cmd-->net stop m

随机推荐