[상단] ReportingService WebService Form 인증

10768 단어 report
이 검증의 전제 조건은 보고서 서버의 인증이 Form 인증으로 바뀌었기 때문입니다. 더 이상 Windows 인증이 아닙니다.그리고 Reporting Service 서비스를 다시 호출할 때 기본값은 윈도우즈 검증이기 때문에 조정이 필요합니다.
SDN에 언급된 바와 같이 Reporting Services 웹 서비스는 Report Manager와 보고 서버가 창 인증을 할 수 있도록 사용자 정의 인증을 제공합니다.Reporting Services Web Services의 LogonUser 방법은 인증서를 보고서 서버에 제출하여 인증하는 데 사용됩니다.웹 서비스는 인증된 로그인 요청에 응답하기 위해 HTTP 헤더를 사용하여 인증 어음(Cookie)을 서버에서 클라이언트로 전달합니다.
인증 프로세스는 다음과 같습니다.
  • 클라이언트 응용 프로그램이 웹 서비스 방법을 호출하여 LogonUser가 사용자를 인증합니다
  • 웹 서비스 호출 보안 확장 (구체적으로 말하면 IAuthenticationExtension을 실현하는 클래스) 의 LogonUser 방법..
  • LogonUser는 사용자 저장소나 보안 기구의 사용자 이름과 비밀번호를 검증합니다..
  • 인증이 완료되면 웹 서비스는 쿠키를 만들고 세션을 관리합니다
  • 웹 서비스는 HTTP 헤더를 통해 인증 어음을 호출된 응용 프로그램에 되돌려줍니다

  • 웹 서비스가 보안 확장을 통해 사용자 인증에 성공하면 다음 요청에 사용할 쿠키가 생성됩니다.보고 서버에 보안 장치가 없기 때문에 이 쿠키는 사용자 정의 보안 장치에 계속 저장되지 않습니다.쿠키는 웹 서비스 방법인 LogonUser에서 되돌아와 다음 웹 서비스 방법 호출과 URL 접근에 사용됩니다.
    구체적인 용도:
    웹 서비스를 사용자 정의 보안 검증에 사용합니다. 웹 서비스 API를 창 인증에 사용할 수 있습니다. 마치 Windows Authentication을 창 인증에 사용하는 것과 같습니다.단, 웹 서비스 코드의 LogonUser를 호출하여 현재 사용자의 증빙서류를 전달해야 합니다.또한 웹 서비스 클라이언트는 Internet Explorer나 다른 웹 브라우저에서 제공하는 자동 쿠키 관리 기능을 갖추지 못할 것입니다.Reporting Service 에이전트 클래스를 확장하여 Cookie 관리를 포함해야 합니다.이를 위해 웹 서비스 클래스의 GetWebRequest 및 GetWebResponse 방법을 덮어쓸 수 있습니다.
    프로젝트를 만들고 Report Service 2005를 참조하십시오.asmx의 웹 서비스.
    protected void Page_Load(object sender, EventArgs e)
    
    {
    
    RenderReport report = new RenderReport();
    
    byte [] result = report.RenderReportToPDF();
    
    //To display the PDF in web browser, set the right content type.
    
    Response.ContentType = “Application/pdf”;
    
     //Write the byte array to the default output stream.
    
    Response.OutputStream.Write(result, 0, result.Length);
    
     //Flush the contents to be displayed in the browser.
    
    Response.Flush();
    
    }
    
    
    
    //Clash to take care of report rendering
    
     public class RenderReport : ReportingService2005
    
    {
    
     //Change to point to your report.
    
     private string ReportPath = “/Test”;
    
     private string m_authCookieName;
    
     private Cookie m_authCookie;
    
     public RenderReport()
    
    {
    
    
    
     // Set the server URL. You can pull this from a config file or what ever way you want to make it dynamic.
    
     base.Url = http://kaneco1/reportserver2008/reportservice2005.asmx;
    
    
    
     // Calling the LogonUser method defined in the ReportService2005.asmx end point.
    
     // The LogonUser method authenticates the specified user to the Report Server Web Service when custom authentication has been configured.
    
     // This is to authenticate against the FBA code and then store the cookie for future reference.
    
     try
    
    {
    
     base.LogonUser(“FBA username”, “password”, null);
    
    }
    
     catch (Exception
    
    )
    
    {
    
    }
    
    }
    
    
    
     /// <summary>
    
     /// Overriding the method defined in the base class.
    
     /// </summary>
    
     /// <param name=”uri”></param>
    
     /// <returns></returns>
    
     protected override WebRequest GetWebRequest(Uri uri)
    
    {
    
     HttpWebRequest request;
    
    request = (HttpWebRequest)HttpWebRequest .Create(uri);
    
    request.Credentials = base .Credentials;
    
    request.CookieContainer = new CookieContainer ();
    
    
    
    if (m_authCookie != null
    
    )
    
    {
    
    request.CookieContainer.Add(m_authCookie);
    
    }
    
    
    
    
    
    return request;
    
    }
    
    
    
     /// <summary>
    
     /// Overriding the method defined in the base class.
    
     /// </summary>
    
     /// <param name=”request”></param>
    
     /// <returns></returns>
    
     protected override WebResponse GetWebResponse(WebRequest request)
    
    {
    
     WebResponse response = base .GetWebResponse(request);
    
     string cookieName = response.Headers[“RSAuthenticationHeader”];
    
     if (cookieName != null)
    
    {
    
    m_authCookieName = cookieName;
    
     HttpWebResponse webResponse = (HttpWebResponse )response;
    
     Cookie authCookie = webResponse.Cookies[cookieName];
    
     // save it for future reference and use.
    
    m_authCookie = authCookie;
    
    }
    
     return response;
    
    }
    
    
    
    /// <summary>
    
     ///Simplified implementation from http://msdn.microsoft.com/en-us/library/reportexecution2005.reportexecutionservice.render.aspx
    
     /// Additionaly it is autheticating against the custom security extension. In our case it is FBA.
    
     /// </summary>
    
     /// <returns>Byte array containing the rendered report in PDF format </returns>
    
    
    
     public byte [] RenderReportToPDF()
    
    {
    
    
    
    //Create a proxy object for ReportExecution2005.asmx referenced in the project.
    
     //You can pull this from a config file or what ever way you want to make it dynamic.
    
     ReportExecutionService rs = new ReportExecutionService ();
    
    rs.Url = “http://kaneco1/ReportServer2008/ReportExecution2005.asmx”;
    
     //Simplified code from http://msdn.microsoft.com/en-us/library/reportexecution2005.reportexecutionservice.render.aspx
    
     byte[] result = null;  
    
     string reportPath = “/SimpleSelect” ;
    
     string format = “PDF” 
    
    string historyID = null;
    
     string devInfo = “”;
    
     string encoding;
    
     string mimeType;
    
     string extension;
    
    
    
    //Since warning is definied in both ReportService2005 and ReportExecution2005 endpoints,
    
     //qualifying it with the appropriate namespace.
    
    WebServiceFBARenderMethod.RE2K5.Warning[] warnings = null;
    
     string[] streamIDs = null;
    
     //Attaching the cookie received from the LogonUser method in the constructor.
    
     //Only when autheticated, it will proceed further with ReportExecution2005.asmx end point calls.
    
     if (null != m_authCookie)
    
    {
    
    
    
    //Store the cookie in the cookie container within ReportExecutionService object.
    
    //So any subsequent call will make use of this authenticated cookie and will be succeeding.
    
    rs.CookieContainer = new CookieContainer();
    
    rs.CookieContainer.Add(m_authCookie);
    
    
    
    ExecutionInfo execInfo = new ExecutionInfo();
    
    ExecutionHeader execHeader = new ExecutionHeader();
    
    
    
    rs.ExecutionHeaderValue = execHeader;
    
    execInfo = rs.LoadReport(reportPath, historyID);
    
    
    
    try
    
    {
    
    result = rs.Render(format, devInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);
    
    }
    
    catch (SoapException e)
    
    {
    
    }
    
    }
    
    else
    
    {
    
    //Logic to recall the LogonUser code with proper username / password.
    
    }
    
    
    
    //Byte array containing the rendered report in PDF.
    
    return result;

    좋은 웹페이지 즐겨찾기