一步一步实现ReportingServices2008匿名访问

ReportingServices2005中我们需要匿名访问报表的时候,只需要在IIS里面做下简单设置就可以实现,而在ReportingServices2008(R2)中不在依靠IIS,只是占用的还是80端口而已。其实匿名访问有很多中解决办法,譬如:使用ReportViewer控件、与SharePoint集成等等......

        下面我介绍SQL团队技术博客所提供的比较彻底而且通用的方法 。(注:修改配置文件前如果害怕出问题请提前备份)

第一步:编译SQL团队所提供的代码并将所生成的Microsoft.Samples.ReportingServices.AnonymousSecurity.dll文件拷贝到SQL Server的安装目录

 

           *:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer\bin

 

          AnonymousSecurity代码如下(代码太长,分为2个部分,编译时候请合并为一个文件):

          1.

ExpandedBlockStart.gif View Code
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  Microsoft.ReportingServices.Interfaces;
using  System.Security.Principal;
using  System.Collections.Specialized;
using  System.Collections;
namespace  Microsoft.Samples.ReportingServices.AnonymousSecurity

{

    
public   class  AuthenticationExtension : IAuthenticationExtension

    {

        
///   <summary>

        
///  You must implement SetConfiguration as required by IExtension

        
///   </summary>

        
///   <param name="configuration"> Configuration data as an XML

        
///  string that is stored along with the Extension element in

        
///  the configuration file. </param>

        [System.Diagnostics.CodeAnalysis.SuppressMessage(
" Microsoft.Security " " CA2123:OverrideLinkDemandsShouldBeIdenticalToBase " )]

        
public   void  SetConfiguration(String configuration)

        {

            
//  No configuration data is needed for this extension

        }

 

        
///   <summary>

        
///  You must implement LocalizedName as required by IExtension

        
///   </summary>

        [System.Diagnostics.CodeAnalysis.SuppressMessage(
" Microsoft.Security " " CA2123:OverrideLinkDemandsShouldBeIdenticalToBase " )]

        
public   string  LocalizedName

        {

            
get

            {

                
return   null ;

            }

        }

 

        
///   <summary>

        
///  Indicates whether a supplied username and password are valid.

        
///   </summary>

        
///   <param name="userName"> The supplied username </param>

        
///   <param name="password"> The supplied password </param>

        
///   <param name="authority"> Optional. The specific authority to use to

        
///  authenticate a user. For example, in Windows it would be a Windows

        
///  Domain </param>

        
///   <returns> true when the username and password are valid </returns>

        [System.Diagnostics.CodeAnalysis.SuppressMessage(
" Microsoft.Security " " CA2123:OverrideLinkDemandsShouldBeIdenticalToBase " )]

        
public   bool  LogonUser( string  userName,  string  password,  string  authority)

        {

            
return   true ;

        }

 

        
///   <summary>

        
///  Required by IAuthenticationExtension. The report server calls the

        
///  GetUserInfo methodfor each request to retrieve the current user

        
///  identity.

        
///   </summary>

        
///   <param name="userIdentity"> represents the identity of the current

        
///  user. The value of IIdentity may appear in a user interface and

        
///  should be human readable </param>

        
///   <param name="userId"> represents a pointer to a unique user identity

        
///   </param>

        [System.Diagnostics.CodeAnalysis.SuppressMessage(
" Microsoft.Security " " CA2123:OverrideLinkDemandsShouldBeIdenticalToBase " )]

        
public   void  GetUserInfo( out  IIdentity userIdentity,  out  IntPtr userId)

        {

            userIdentity 
=   new  GenericIdentity( " dummy user " );

            userId 
=  IntPtr.Zero;

        }

 

        
///   <summary>

        
///  The IsValidPrincipalName method is called by the report server when

        
///  the report server sets security on an item. This method validates

        
///  that the user name is valid for Windows.The principal name needs to

        
///  be a user, group, or builtin account name.

        
///   </summary>

        
///   <param name="principalName"> A user, group, or built-in account name

        
///   </param>

        
///   <returns> true when the principle name is valid </returns>

        [System.Diagnostics.CodeAnalysis.SuppressMessage(
" Microsoft.Security " " CA2123:OverrideLinkDemandsShouldBeIdenticalToBase " )]

        
public   bool  IsValidPrincipalName( string  principalName)

        {

            
return   true ;

        }

    }

}

 

namespace  Microsoft.Samples.ReportingServices.AnonymousSecurity

{

    
public   class  Authorization : IAuthorizationExtension

    {

        
static  Authorization()

        {

            InitializeMaps();

        }

 

        
///   <summary>

        
///  Returns a security descriptor that is stored with an individual

        
///  item in the report server database.

        
///   </summary>

        
///   <param name="acl"> The access code list (ACL) created by the report

        
///  server for the item. It contains a collection of access code entry

        
///  (ACE) structures. </param>

        
///   <param name="itemType"> The type of item for which the security

        
///  descriptor is created. </param>

        
///   <param name="stringSecDesc"> Optional. A user-friendly description

        
///  of the security descriptor, used for debugging. This is not stored

        
///  by the report server. </param>

        
///   <returns> Should be implemented to return a serialized access code

        
///  list for the item. </returns>

        [System.Diagnostics.CodeAnalysis.SuppressMessage(
" Microsoft.Security " " CA2123:OverrideLinkDemandsShouldBeIdenticalToBase " )]

        
public   byte [] CreateSecurityDescriptor(

            AceCollection acl,

            SecurityItemType itemType,

            
out   string  stringSecDesc)

        {

            stringSecDesc 
=   null ;

            
return   null ;

        }

 

        
public   bool  CheckAccess(

            
string  userName,

            IntPtr userToken,

            
byte [] secDesc,

            ModelItemOperation modelItemOperation)

        {

            
return   true ;

        }

 

        
public   bool  CheckAccess(

            
string  userName,

            IntPtr userToken,

            
byte [] secDesc,

            ModelOperation modelOperation)

        {

            
return   true ;

        }

 

        
///   <summary>

        
///  Indicates whether a given user is authorized to access the item

        
///  for a given catalog operation.

        
///   </summary>

        
///   <param name="userName"> The name of the user as returned by the

        
///  GetUserInfo method. </param>

        
///   <param name="userToken"> Pointer to the user ID returned by

        
///  GetUserInfo. </param>

        
///   <param name="secDesc"> The security descriptor returned by

        
///  CreateSecurityDescriptor. </param>

        
///   <param name="requiredOperation"> The operation being requested by

        
///  the report server for a given user. </param>

        
///   <returns> True if the user is authorized. </returns>

        
public   bool  CheckAccess(

            
string  userName,

            IntPtr userToken,

            
byte [] secDesc,

            CatalogOperation requiredOperation)

        {

            
return   true ;

        }

 

        
//  Overload for array of catalog operations

        
public   bool  CheckAccess(

            
string  userName,

            IntPtr userToken,

            
byte [] secDesc,

            CatalogOperation[] requiredOperations)

        {

            
return   true ;

        }

 

        
//  Overload for Report operations

        
public   bool  CheckAccess(

            
string  userName,

            IntPtr userToken,

            
byte [] secDesc,

            ReportOperation requiredOperation)

        {

            
return   true ;

        }

 

        
//  Overload for Folder operations

        
public   bool  CheckAccess(

            
string  userName,

            IntPtr userToken,

            
byte [] secDesc,

            FolderOperation requiredOperation)

        {

            
return   true ;

        }

 

        
//  Overload for an array of Folder operations

        
public   bool  CheckAccess(

            
string  userName,

            IntPtr userToken,

            
byte [] secDesc,

            FolderOperation[] requiredOperations)

        {

            
return   true ;

        }

 

        
//  Overload for Resource operations

        
public   bool  CheckAccess(

            
string  userName,

            IntPtr userToken,

            
byte [] secDesc,

            ResourceOperation requiredOperation)

        {

            
return   true ;

        }

 

        
//  Overload for an array of Resource operations

        
public   bool  CheckAccess(

            
string  userName,

            IntPtr userToken,

            
byte [] secDesc,

            ResourceOperation[] requiredOperations)

        {

            
return   true ;

        }

 

        
//  Overload for Datasource operations

        
public   bool  CheckAccess(

            
string  userName,

            IntPtr userToken,

            
byte [] secDesc,

            DatasourceOperation requiredOperation)

        {

            
return   true ;

        }

 

          2.

ExpandedBlockStart.gif View Code
///   <summary>

        
///  Returns the set of permissions a specific user has for a specific

        
///  item managed in the report server database. This provides underlying

        
///  support for the Web service method GetPermissions().

        
///   </summary>

        
///   <param name="userName"> The name of the user as returned by the

        
///  GetUserInfo method. </param>

        
///   <param name="userToken"> Pointer to the user ID returned by

        
///  GetUserInfo. </param>

        
///   <param name="itemType"> The type of item for which the permissions

        
///  are returned. </param>

        
///   <param name="secDesc"> The security descriptor associated with the

        
///  item. </param>

        
///   <returns></returns>

        [System.Diagnostics.CodeAnalysis.SuppressMessage(
" Microsoft.Security " " CA2123:OverrideLinkDemandsShouldBeIdenticalToBase " ), System.Diagnostics.CodeAnalysis.SuppressMessage( " Microsoft.Maintainability " " CA1502:AvoidExcessiveComplexity " )]

        
public  StringCollection GetPermissions( string  userName, IntPtr userToken,

         SecurityItemType itemType, 
byte [] secDesc)

        {

            
return  m_fullPermissions;

        }

 

        
private   static  Hashtable m_ModelItemOperNames;

        
private   static  Hashtable m_ModelOperNames;

        
private   static  Hashtable m_CatOperNames;

        
private   static  Hashtable m_FldOperNames;

        
private   static  Hashtable m_RptOperNames;

        
private   static  Hashtable m_ResOperNames;

        
private   static  Hashtable m_DSOperNames;

        
private   static  StringCollection m_fullPermissions  =   new  StringCollection();

 

        
private   const   int  NrRptOperations  =   27 ;

        
private   const   int  NrFldOperations  =   10 ;

        
private   const   int  NrResOperations  =   7 ;

        
private   const   int  NrDSOperations  =   7 ;

        
private   const   int  NrCatOperations  =   16 ;

        
private   const   int  NrModelOperations  =   11 ;

        
private   const   int  NrModelItemOperations  =   1 ;

 

        
//  Utility method used to create mappings to the various

        
//  operations in Reporting Services. These mappings support

        
//  the implementation of the GetPermissions method.

        [System.Diagnostics.CodeAnalysis.SuppressMessage(
" Microsoft.Usage " " CA2201:DoNotRaiseReservedExceptionTypes " ), System.Diagnostics.CodeAnalysis.SuppressMessage( " Microsoft.Usage " " CA2201:DoNotRaiseReservedExceptionTypes " ), System.Diagnostics.CodeAnalysis.SuppressMessage( " Microsoft.Usage " " CA2201:DoNotRaiseReservedExceptionTypes " ), System.Diagnostics.CodeAnalysis.SuppressMessage( " Microsoft.Usage " " CA2201:DoNotRaiseReservedExceptionTypes " ), System.Diagnostics.CodeAnalysis.SuppressMessage( " Microsoft.Usage " " CA2201:DoNotRaiseReservedExceptionTypes " ), System.Diagnostics.CodeAnalysis.SuppressMessage( " Microsoft.Usage " " CA2201:DoNotRaiseReservedExceptionTypes " ), System.Diagnostics.CodeAnalysis.SuppressMessage( " Microsoft.Usage " " CA2201:DoNotRaiseReservedExceptionTypes " )]

        
private   static   void  InitializeMaps()

        {

            
//  create model operation names data

            m_ModelItemOperNames 
=   new  Hashtable();

            m_ModelItemOperNames.Add(ModelItemOperation.ReadProperties,

               OperationNames.OperReadProperties);

 

            
if  (m_ModelItemOperNames.Count  !=  NrModelItemOperations)

            {

                
// Model item name mismatch

                
throw   new  Exception( " Model item name mismatch " );

            }

 

            
//  create model operation names data

            m_ModelOperNames 
=   new  Hashtable();

            m_ModelOperNames.Add(ModelOperation.Delete,

               OperationNames.OperDelete);

            m_ModelOperNames.Add(ModelOperation.ReadAuthorizationPolicy,

              OperationNames.OperReadAuthorizationPolicy);

            m_ModelOperNames.Add(ModelOperation.ReadContent,

              OperationNames.OperReadContent);

            m_ModelOperNames.Add(ModelOperation.ReadDatasource,

              OperationNames.OperReadDatasources);

            m_ModelOperNames.Add(ModelOperation.ReadModelItemAuthorizationPolicies,

              OperationNames.OperReadModelItemSecurityPolicies);

            m_ModelOperNames.Add(ModelOperation.ReadProperties,

              OperationNames.OperReadProperties);

            m_ModelOperNames.Add(ModelOperation.UpdateContent,

              OperationNames.OperUpdateContent);

            m_ModelOperNames.Add(ModelOperation.UpdateDatasource,

              OperationNames.OperUpdateDatasources);

            m_ModelOperNames.Add(ModelOperation.UpdateDeleteAuthorizationPolicy,

              OperationNames.OperUpdateDeleteAuthorizationPolicy);

            m_ModelOperNames.Add(ModelOperation.UpdateModelItemAuthorizationPolicies,

              OperationNames.OperUpdateModelItemSecurityPolicies);

            m_ModelOperNames.Add(ModelOperation.UpdateProperties,

              OperationNames.OperUpdatePolicy);

 

            
if  (m_ModelOperNames.Count  !=  NrModelOperations)

            {

                
// Model name mismatch

                
throw   new  Exception( " Model name mismatch " );

            }

 

            
//  create operation names data

            m_CatOperNames 
=   new  Hashtable();

            m_CatOperNames.Add(CatalogOperation.CreateRoles,

               OperationNames.OperCreateRoles);

            m_CatOperNames.Add(CatalogOperation.DeleteRoles,

               OperationNames.OperDeleteRoles);

            m_CatOperNames.Add(CatalogOperation.ReadRoleProperties,

               OperationNames.OperReadRoleProperties);

            m_CatOperNames.Add(CatalogOperation.UpdateRoleProperties,

               OperationNames.OperUpdateRoleProperties);

            m_CatOperNames.Add(CatalogOperation.ReadSystemProperties,

               OperationNames.OperReadSystemProperties);

            m_CatOperNames.Add(CatalogOperation.UpdateSystemProperties,

               OperationNames.OperUpdateSystemProperties);

            m_CatOperNames.Add(CatalogOperation.GenerateEvents,

               OperationNames.OperGenerateEvents);

            m_CatOperNames.Add(CatalogOperation.ReadSystemSecurityPolicy,

               OperationNames.OperReadSystemSecurityPolicy);

            m_CatOperNames.Add(CatalogOperation.UpdateSystemSecurityPolicy,

               OperationNames.OperUpdateSystemSecurityPolicy);

            m_CatOperNames.Add(CatalogOperation.CreateSchedules,

               OperationNames.OperCreateSchedules);

            m_CatOperNames.Add(CatalogOperation.DeleteSchedules,

               OperationNames.OperDeleteSchedules);

            m_CatOperNames.Add(CatalogOperation.ReadSchedules,

               OperationNames.OperReadSchedules);

            m_CatOperNames.Add(CatalogOperation.UpdateSchedules,

               OperationNames.OperUpdateSchedules);

            m_CatOperNames.Add(CatalogOperation.ListJobs,

               OperationNames.OperListJobs);

            m_CatOperNames.Add(CatalogOperation.CancelJobs,

               OperationNames.OperCancelJobs);

            m_CatOperNames.Add(CatalogOperation.ExecuteReportDefinition,

             OperationNames.ExecuteReportDefinition);

            
if  (m_CatOperNames.Count  !=  NrCatOperations)

            {

                
// Catalog name mismatch

                
throw   new  Exception( " Catalog name mismatch " );

            }

 

            m_FldOperNames 
=   new  Hashtable();

            m_FldOperNames.Add(FolderOperation.CreateFolder,

               OperationNames.OperCreateFolder);

            m_FldOperNames.Add(FolderOperation.Delete,

               OperationNames.OperDelete);

            m_FldOperNames.Add(FolderOperation.ReadProperties,

               OperationNames.OperReadProperties);

            m_FldOperNames.Add(FolderOperation.UpdateProperties,

               OperationNames.OperUpdateProperties);

            m_FldOperNames.Add(FolderOperation.CreateReport,

               OperationNames.OperCreateReport);

            m_FldOperNames.Add(FolderOperation.CreateResource,

               OperationNames.OperCreateResource);

            m_FldOperNames.Add(FolderOperation.ReadAuthorizationPolicy,

               OperationNames.OperReadAuthorizationPolicy);

            m_FldOperNames.Add(FolderOperation.UpdateDeleteAuthorizationPolicy,

               OperationNames.OperUpdateDeleteAuthorizationPolicy);

            m_FldOperNames.Add(FolderOperation.CreateDatasource,

               OperationNames.OperCreateDatasource);

            m_FldOperNames.Add(FolderOperation.CreateModel,

               OperationNames.OperCreateModel);

            
if  (m_FldOperNames.Count  !=  NrFldOperations)

            {

                
// Folder name mismatch

                
throw   new  Exception( " Folder name mismatch " );

            }

 

            m_RptOperNames 
=   new  Hashtable();

            m_RptOperNames.Add(ReportOperation.Delete,

               OperationNames.OperDelete);

            m_RptOperNames.Add(ReportOperation.ReadProperties,

               OperationNames.OperReadProperties);

            m_RptOperNames.Add(ReportOperation.UpdateProperties,

               OperationNames.OperUpdateProperties);

            m_RptOperNames.Add(ReportOperation.UpdateParameters,

               OperationNames.OperUpdateParameters);

            m_RptOperNames.Add(ReportOperation.ReadDatasource,

               OperationNames.OperReadDatasources);

            m_RptOperNames.Add(ReportOperation.UpdateDatasource,

               OperationNames.OperUpdateDatasources);

            m_RptOperNames.Add(ReportOperation.ReadReportDefinition,

               OperationNames.OperReadReportDefinition);

            m_RptOperNames.Add(ReportOperation.UpdateReportDefinition,

               OperationNames.OperUpdateReportDefinition);

            m_RptOperNames.Add(ReportOperation.CreateSubscription,

               OperationNames.OperCreateSubscription);

            m_RptOperNames.Add(ReportOperation.DeleteSubscription,

               OperationNames.OperDeleteSubscription);

            m_RptOperNames.Add(ReportOperation.ReadSubscription,

               OperationNames.OperReadSubscription);

            m_RptOperNames.Add(ReportOperation.UpdateSubscription,

               OperationNames.OperUpdateSubscription);

            m_RptOperNames.Add(ReportOperation.CreateAnySubscription,

               OperationNames.OperCreateAnySubscription);

            m_RptOperNames.Add(ReportOperation.DeleteAnySubscription,

               OperationNames.OperDeleteAnySubscription);

            m_RptOperNames.Add(ReportOperation.ReadAnySubscription,

               OperationNames.OperReadAnySubscription);

            m_RptOperNames.Add(ReportOperation.UpdateAnySubscription,

               OperationNames.OperUpdateAnySubscription);

            m_RptOperNames.Add(ReportOperation.UpdatePolicy,

               OperationNames.OperUpdatePolicy);

            m_RptOperNames.Add(ReportOperation.ReadPolicy,

               OperationNames.OperReadPolicy);

            m_RptOperNames.Add(ReportOperation.DeleteHistory,

               OperationNames.OperDeleteHistory);

            m_RptOperNames.Add(ReportOperation.ListHistory,

               OperationNames.OperListHistory);

            m_RptOperNames.Add(ReportOperation.ExecuteAndView,

               OperationNames.OperExecuteAndView);

            m_RptOperNames.Add(ReportOperation.CreateResource,

               OperationNames.OperCreateResource);

            m_RptOperNames.Add(ReportOperation.CreateSnapshot,

               OperationNames.OperCreateSnapshot);

            m_RptOperNames.Add(ReportOperation.ReadAuthorizationPolicy,

               OperationNames.OperReadAuthorizationPolicy);

            m_RptOperNames.Add(ReportOperation.UpdateDeleteAuthorizationPolicy,

               OperationNames.OperUpdateDeleteAuthorizationPolicy);

            m_RptOperNames.Add(ReportOperation.Execute,

               OperationNames.OperExecute);

            m_RptOperNames.Add(ReportOperation.CreateLink,

               OperationNames.OperCreateLink);

 

            
if  (m_RptOperNames.Count  !=  NrRptOperations)

            {

                
// Report name mismatch

                
throw   new  Exception( " Report name mismatch " );

            }

 

            m_ResOperNames 
=   new  Hashtable();

            m_ResOperNames.Add(ResourceOperation.Delete,

               OperationNames.OperDelete);

            m_ResOperNames.Add(ResourceOperation.ReadProperties,

               OperationNames.OperReadProperties);

            m_ResOperNames.Add(ResourceOperation.UpdateProperties,

               OperationNames.OperUpdateProperties);

            m_ResOperNames.Add(ResourceOperation.ReadContent,

               OperationNames.OperReadContent);

            m_ResOperNames.Add(ResourceOperation.UpdateContent,

               OperationNames.OperUpdateContent);

            m_ResOperNames.Add(ResourceOperation.ReadAuthorizationPolicy,

               OperationNames.OperReadAuthorizationPolicy);

            m_ResOperNames.Add(ResourceOperation.UpdateDeleteAuthorizationPolicy,

               OperationNames.OperUpdateDeleteAuthorizationPolicy);

 

            
if  (m_ResOperNames.Count  !=  NrResOperations)

            {

                
// Resource name mismatch

                
throw   new  Exception( " Resource name mismatch " );

            }

 

            m_DSOperNames 
=   new  Hashtable();

            m_DSOperNames.Add(DatasourceOperation.Delete,

               OperationNames.OperDelete);

            m_DSOperNames.Add(DatasourceOperation.ReadProperties,

               OperationNames.OperReadProperties);

            m_DSOperNames.Add(DatasourceOperation.UpdateProperties,

               OperationNames.OperUpdateProperties);

            m_DSOperNames.Add(DatasourceOperation.ReadContent,

               OperationNames.OperReadContent);

            m_DSOperNames.Add(DatasourceOperation.UpdateContent,

               OperationNames.OperUpdateContent);

            m_DSOperNames.Add(DatasourceOperation.ReadAuthorizationPolicy,

               OperationNames.OperReadAuthorizationPolicy);

            m_DSOperNames.Add(DatasourceOperation.UpdateDeleteAuthorizationPolicy,

               OperationNames.OperUpdateDeleteAuthorizationPolicy);

 

            
if  (m_DSOperNames.Count  !=  NrDSOperations)

            {

                
// Datasource name mismatch

                
throw   new  Exception( " Datasource name mismatch " );

            }

 

            
//  Initialize permission collection.

            
foreach  (CatalogOperation oper  in  m_CatOperNames.Keys)

            {

                
if  ( ! m_fullPermissions.Contains(( string )m_CatOperNames[oper]))

                    m_fullPermissions.Add((
string )m_CatOperNames[oper]);

            }

            
foreach  (ModelItemOperation oper  in  m_ModelItemOperNames.Keys)

            {

                
if  ( ! m_fullPermissions.Contains(( string )m_ModelItemOperNames[oper]))

                    m_fullPermissions.Add((
string )m_ModelItemOperNames[oper]);

            }

            
foreach  (ModelOperation oper  in  m_ModelOperNames.Keys)

            {

                
if  ( ! m_fullPermissions.Contains(( string )m_ModelOperNames[oper]))

                    m_fullPermissions.Add((
string )m_ModelOperNames[oper]);

            }

            
foreach  (CatalogOperation oper  in  m_CatOperNames.Keys)

            {

                
if  ( ! m_fullPermissions.Contains(( string )m_CatOperNames[oper]))

                    m_fullPermissions.Add((
string )m_CatOperNames[oper]);

            }

            
foreach  (ReportOperation oper  in  m_RptOperNames.Keys)

            {

                
if  ( ! m_fullPermissions.Contains(( string )m_RptOperNames[oper]))

                    m_fullPermissions.Add((
string )m_RptOperNames[oper]);

            }

            
foreach  (FolderOperation oper  in  m_FldOperNames.Keys)

            {

                
if  ( ! m_fullPermissions.Contains(( string )m_FldOperNames[oper]))

                    m_fullPermissions.Add((
string )m_FldOperNames[oper]);

            }

            
foreach  (ResourceOperation oper  in  m_ResOperNames.Keys)

            {

                
if  ( ! m_fullPermissions.Contains(( string )m_ResOperNames[oper]))

                    m_fullPermissions.Add((
string )m_ResOperNames[oper]);

            }

            
foreach  (DatasourceOperation oper  in  m_DSOperNames.Keys)

            {

                
if  ( ! m_fullPermissions.Contains(( string )m_DSOperNames[oper]))

                    m_fullPermissions.Add((
string )m_DSOperNames[oper]);

            }

        }

 

        
///   <summary>

        
///  You must implement SetConfiguration as required by IExtension

        
///   </summary>

        
///   <param name="configuration"> Configuration data as an XML

        
///  string that is stored along with the Extension element in

        
///  the configuration file. </param>

        [System.Diagnostics.CodeAnalysis.SuppressMessage(
" Microsoft.Security " " CA2123:OverrideLinkDemandsShouldBeIdenticalToBase " ), System.Diagnostics.CodeAnalysis.SuppressMessage( " Microsoft.Usage " " CA2201:DoNotRaiseReservedExceptionTypes " ), System.Diagnostics.CodeAnalysis.SuppressMessage( " Microsoft.Usage " " CA2201:DoNotRaiseReservedExceptionTypes " )]

        
public   void  SetConfiguration( string  configuration)

        {

        }

 

        [System.Diagnostics.CodeAnalysis.SuppressMessage(
" Microsoft.Security " " CA2123:OverrideLinkDemandsShouldBeIdenticalToBase " )]

        
public   string  LocalizedName

        {

            
get

            {

                
//  Return a localized name for this extension

                
return   null ;

            }

        }

    }

}

 

         你的项目中还需引用Microsoft.ReportingServices.Interfaces.dll 否则编译会通不过

第二步:修改*:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer

                 *:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager文件中的web.config文件,替换二者中的节点,将

 

 

ExpandedBlockStart.gif View Code
     < authentication  mode ="Windows"   />
    
< identity  impersonate ="true" />

 

 

 

 替换为

 

ExpandedBlockStart.gif View Code
  < authentication  mode ="None"   />
 
< identity  impersonate ="false" />

 第三步:修改*:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer修改

                rereportserver.config

            把

 

ExpandedBlockStart.gif View Code
< Authentication >
   
< AuthenticationTypes >
    
< RSWindowsNegotiate />
    
< RSWindowsNTLM />
   
</ AuthenticationTypes >
< EnableAuthPersistence > true </ EnableAuthPersistence >
</ Authentication >

          修改为

 

ExpandedBlockStart.gif View Code
< Authentication >
   
< AuthenticationTypes >
    
< Custom />
   
</ AuthenticationTypes >
< EnableAuthPersistence > true </ EnableAuthPersistence >
</ Authentication >

 第四步:修改*:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer修改

             rereportserver.config

            在

ExpandedBlockStart.gif View Code
    < 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 >

            节点下,添加

ExpandedBlockStart.gif View Code
< 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 >

 

 

到此为止,ReportingServices2008(R2)的匿名访问就大功告成了。

参考资料:

 

http://blogs.msdn.com/b/jameswu/archive/2008/07/15/anonymous-access-in-sql-rs-2008.aspx (官方教程)

 

 

http://lonely7345.cnblogs.com/ (对于 AnonymousSecurity .dll有中文解释)

 

没有找到附件选项,所以大家可以编译上文代码,如有需要AnonymousSecurity.dll 请留下邮箱(诚恳告诉我博客园怎么用附件)


 

 

 

 

 

转载于:https://www.cnblogs.com/zhukuanglong/archive/2011/06/07/2074374.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值