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

作者:老张一笑 时间:2024-01-20 04:24:05 

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

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

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 匿名登录的问题及解决方案

来源:https://www.cnblogs.com/xtdhb/p/4000354.html

标签:SQL,Server,Reporting,Services,匿名登录
0
投稿

猜你喜欢

  • Python使用OpenCV进行标定

    2022-08-17 15:05:33
  • Vue.js中的图片引用路径的方式

    2024-05-09 15:28:10
  • 人脸检测——基于Flask和PaddleHub

    2022-10-09 02:01:30
  • python执行CMD指令,并获取返回的方法

    2021-10-19 02:52:40
  • perl用变量做句柄介绍

    2022-12-18 22:19:01
  • ASP 验证码的程序及原理

    2010-04-24 15:56:00
  • python+opencv 读取文件夹下的所有图像并批量保存ROI的方法

    2021-02-23 13:07:23
  • python基础之匿名函数详解

    2021-08-23 12:15:18
  • pymongo实现多结果进行多列排序的方法

    2023-08-27 21:33:42
  • SQLserver中的declare变量用法

    2024-01-18 22:40:19
  • Python smallseg分词用法实例分析

    2023-02-09 01:04:26
  • Yii框架登录流程分析

    2024-05-11 09:19:43
  • MySQL中批量删除指定前缀表的sql语句

    2024-01-17 07:37:07
  • GO语言中接口和接口型函数的具体使用

    2023-06-18 09:08:40
  • 微信小程序上传图片功能(附后端代码)

    2023-07-24 04:21:40
  • Flask框架使用DBUtils模块连接数据库操作示例

    2024-01-26 11:46:10
  • 设计师和美工

    2008-10-27 13:43:00
  • 网站制作流程及界面交互设计

    2007-10-26 12:00:00
  • Python 添加文件注释和函数注释操作

    2021-07-23 07:16:54
  • python 重定向获取真实url的方法

    2022-10-25 03:24:46
  • asp之家 网络编程 m.aspxhome.com