0

我的目标是从具有嵌入式浏览器的 WPF 应用程序执行单点登录功能。需要为此实施单点登录,这样就不会要求用户再次输入此凭据以检查来自 wpf 浏览器的报告。我需要创建一个本地环境来从我这边测试此功能,因为我正在开发产品,即具有表单身份验证和从我的应用程序记录到报告的 sql 报告。我已经浏览了网上关于这个实现的几乎所有内容,微软为表单身份验证提供的示例不起作用。我还发现该示例无法在基于 Itanium 的处理器等中工作的某些情况。我正在开发 ssrs 2012。通过捕获报告站点的 DOM 并执行登录来登录不会' 这不是一个好主意,因为这是针对产品的,并且报告登录不会相同。我正在考虑使用 Httpwebrequest 和 Response 来实现,但仍然不清楚如何实现。有人请为我的实施提供清晰可行的解决方案。提前致谢。

4

2 回答 2

0

有人请为我的实施提供清晰可行的解决方案。

我不会指望这一点,特别是如果您要求源代码解决方案。

单点登录假定您在某处仍有身份验证服务器,例如Google OAuth。从你的问题来看,我不太清楚这是否是你要找的。如果您只需要提供自定义凭据来WebBrowser控制,那仍然是可能的,但该解决方案适用于WinForms 版本WebBrowser控制。WPF 版本无法自定义,因此使用WindowsFormsHostWebBrowser在 WPF 项目中托管 WinForms 可能会更好。

于 2013-09-09T06:35:08.997 回答
0

我终于找到了为报告服务实施单点登录的方法。为表单身份验证实现单点登录的标准方法是使用自定义安全扩展示例。配置有点棘手,但是一旦配置完成,需要通过在报告服务中调用 Logonuser() 方法获取身份验证令牌来完成单点登录。以下代码传递凭据并返回身份验证令牌。

可以在这里找到详细的配置表单身份验证 http://www.codeproject.com/Articles/675943/SSRS-2012-Forms-Authentication

下面的代码帮助我实现单点登录。

 [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool InternetSetCookie(string lpszUrlName, string lpszCookieName, string lpszCookieData);
private void GetAuthToken(string username, string password)
{
// Step1: Add reference to report service either by directly referencing the reportinservice.asmx service of by converting wsdl to class file.

 ReportServerProxy2010 rsProxy = new ReportServerProxy2010();
//Step2: Assign the report server service eg:"http://<servername>/ReportServer/ReportService2010.asmx";

              rsProxy.Url = string.Format(ReportServerUrl, ReportServer);
try
              {
                rsProxy.LogonUser(username,password, null);
                Cookie authCookie = rsProxy.AuthCookie;
if (authCookie != null)
                {
//Internet Set Cookie is a com method which sets the obtained auth token to internet explorer

                  InternetSetCookie(Url, null, authCookie.ToString());
                }
              }
catch (Exception ex)
              {
              }
            }
//When navigating now, the auth token is accepted and report manager page is displayed directly without asking for login credentials.
WebBrowserControl.Navigate(new Uri("");}
于 2013-10-31T09:40:39.423 回答