如何解决此SSRS身份验证异常?

时间:2011-03-10 10:18:35

标签: .net security ssrs-2008 formsauthentication

我正在尝试在SSRS 2008(而不是R2)中实现一些自定义安全代码,以允许表单身份验证而不是Windows身份验证。我已经将我的解决方案基于Microsoft示例代码,并且已经设法使大部分工作完全正常。我遇到问题的唯一区域是登录实际的Report Manager URL。

第1期 使用网址http://localhost/Reports_MSSQL2008/时,它不会选择我已复制到UILogon.aspx文件夹中的/Pages页面(按照Microsoft示例的说明)。我修改了ReportManager文件夹中的web.config以包含以下内容:

<authentication mode="Forms">
  <forms loginUrl="UILogon.aspx" 
         name="sqlAuthCookie" 
         timeout="60" 
         slidingExpiration="true" 
         path="/" />
</authentication>

我已经尝试更改路径以匹配aspx文件的确切路径,但仍然没有快乐!

第2期 由于上述问题,我尝试通过URL http://localhost/Reports_MSSQL2008/Pages/UILogon.aspx进入UILogon和ReportManager。这是因为我可以进入我的自定义代码(UILogon.aspx.cs和IAuthorisation / IAuthentication代码),我可以看到它执行以下操作:

  • 验证/授权用户
  • 创建cookie
  • 将cookie(sqlAuthCookie)存储在响应/请求cookie容器
  • 执行response.redirect到/Folder.aspx页面

问题是,当response.redirect返回到GetUserInfo()方法时,HttpContext.Current.User为null,并且不再有cookie。因此,返回null IIdentity(无法将其设置为其他任何内容!!)并且SSRS会抛出错误...

  

Microsoft.ReportingServices.Diagnostics.Utilities.AuthenticationExtensionException:
  身份验证扩展会引发意外异常或返回无效的值:identity == null。

有关信息 - 当我启动Report Builder / Visual Studio bi proj / Web服务URL时,它完全符合我的要求并且工作正常......它只是导致问题的报表管理器。

1 个答案:

答案 0 :(得分:4)

我现在已经解决了....我必须将以下内容添加到rsreportserver.config:

<UI>
    <CustomAuthenticationUI>
        <loginUrl>/Pages/UILogon.aspx</loginUrl>
    <UseSSL>false</UseSSL> 
    </CustomAuthenticationUI>
    <ReportServerUrl></ReportServerUrl>
    <PageCountMode>Estimate</PageCountMode>
</UI>

并且只在web.config中包含以下内容:

<authentication mode="Forms" />

另外,为了安全防范从GetUserInfo()传回的空身份,我编写了以下代码:

public void GetUserInfo(out IIdentity userIdentity, out IntPtr userId)
{
    //default the userIdentity
    userIdentity = new GenericIdentity(WindowsIdentity.GetCurrent().Name);

    // If the current user identity is not null,
    // set the userIdentity parameter to that of the current user 
    if (HttpContext.Current != null
          && HttpContext.Current.User != null)
    {
        userIdentity = HttpContext.Current.User.Identity;
    }

    // initialize a pointer to the current user id to zero
    userId = IntPtr.Zero;
}