SSRS 表单身份验证 - 如何将 Cookie 凭据传递到报表服务器

SSRS Forms Authentication - How To Pass Cookie Credentials To Report Server

我目前正在尝试使用表单身份验证在我的 Web 应用程序中呈现 SSRS 报告。

我的 SSRS 报告版本是 2016。

最初我的印象是 NetworkCredentials 可以工作,在遇到错误后,我发现我们需要使用 FormsAuthentication,并传递 cookie 作为对用户进行身份验证的一种方式。

我已经按照下面 link 中的指南对报告服务器中的配置文件进行了必要的设置:-

https://github.com/Microsoft/Reporting-Services/tree/master/CustomSecuritySample2016

报告服务在 localhost/ReportServer 和 SSRS 门户,localhost/Reports。我也可以访问所述服务器 远程。

下面是我用来获取经过身份验证的 cookie 的代码。

MyReportingService rsClient = new MyReportingService();
rsClient.Url = "http://xxx.xxx.xxx.xxx/reportserver/ReportService2010.asmx";
try
{
     rsClient.LogonUser("user", "password", "");
     Cookie myAuthCookie = rsClient.AuthCookie;
     HttpCookie cookie = new HttpCookie(myAuthCookie.Name, myAuthCookie.Value);
     Response.Cookies.Add(cookie);
}

据称随后将用于对用户进行身份验证。

Cookie authCookie = new Cookie(cookie2.Name, cookie2.Value);

authCookie.Domain = "DomainName";

rvSiteMapping.ServerReport.ReportServerCredentials = new MyReportServerCredentials(authCookie);

rvSiteMapping.ServerReport.Cookies.Add(authCookie);

并且在我的 IReportsServerCredentials 内的表单身份验证中 Class:-

public bool GetFormsCredentials(out Cookie authCookie,
            out string user, out string password, out string authority)
        {
            authCookie = m_authCookie;
            user = password = authority = null;
            return true;  // Use forms credentials to authenticate.
        }

我遇到的问题是应用程序将凭据传递到报表服务器时。我相信我一定是做错了这部分,因为虽然我的应用程序确实获得了 cookie,但当它验证 cookie 提供的凭据时,我收到 text/html 错误:-

Object moved to <a href="/ReportServer/logon.aspx?ReturnUrl=%2fReportserver%2fReportExecution2005.asmx" />

此错误是为了响应在以下情况下设置默认通用标识 HttpContext.Current.User = null.

if (HttpContext.Current != null
                 && HttpContext.Current.User != null)
{
     userIdentity = HttpContext.Current.User.Identity;
}
else
{
     userIdentity = new GenericIdentity("AnonymousUser");
} 

我尝试用谷歌搜索答案,但大部分结果都是 windows 身份验证和少数与表单身份验证相关的 与我提到的代码非常相似。

问题的根本原因一直在我眼皮底下。

域名应该指的是 web 域而不是活动目录域。

authCookie.Domain = "DomainName";

Cookie 现在能够按预期对用户进行身份验证。

希望这对碰巧犯同样错误的人有所帮助。