Embedded Images in SSRS Reports not Displaying - Permissions Issue - reporting-services

I have a logo at the top of all my reports that I have as an embedded image.
These reports are displayed in an ASP.Net web app via the SSRS web service interface - all pretty standard stuff but the image doesn't render - I just get a broken link.
There are a number of possible solutions for this problem and I've tried a few things including setting UseSessionCookies to false in the ConfigurationInfo table.
What I've noticed is that the image displays fine when I change the anonymous account of the consuming web app from a least privileged service account to my own user account.
I do not understand why this and can't work out what special permissions are needed by my web app's service account to be able to view embedded images in reports.
Can anyone help?

Ok, problem solved. Kind of. The problem isn't limited to embedded images and occurs because I am not using the reporting services viewer.
To summarise:
1) when your web application is making the call to the report server it is fully authorized to do so. A SessionID is generated that is ONLY available to the web application account (i.e. the Service account under which the app runs).
2) the web app outputs the RAW HTML4.0 to the screen.
3) the browser receives the HTML and tries to retrieve the images referenced in the HTML.
4) the browser is running as your user account (e.g. domain\username1)
5) the report server receives a request that looks like:
6) now the SessionID listed in the URL is not associated with domain\username1, so report server claims it does not exist.
When you set the app domain to use the domain\username1 account, then the SessionID happens to be associated with your the account so suddently things 'work'. But the moment real users try the system they complain that the images are missing, since their domain\usernameN does not match the app pool account.
The solutions to this problem are as follows:
1) use the Report Viewer control. This will ensure that the URLs received by the Browser will point back to your web app and your web app identity will be used to retrieve them from the report server.
2) in your web app code, parse the HTML4.0 that you get back from the Render call, fetch and cache all the images, re-write the HTML4.0 links to point to the cached images stored by your web app and then send it to the browser (if this seems complicated... then use the Report Viewer control since it make the scenario work)
3) you can try to use the MHTML output format, this will produce a fully qualified report with images embedded in the since binary stream. The consequence of this is it is harder to embed it within an application page... but not insurmountable
I chose to use a variation on 2) because I don't want to use the report viewer. The logo I'm trying to display is already hosted in the calling web app so I just replace the src attribute of the img tag in the response returned from the SSRS report execution service with the url to this location.
I really don't want to use the report viewer as suggested as the best solution to this issue. Why SSRS has to use session information to return something as simple as a logo that is displayed on all reports is beyond me.... It has taken ages to get to the bottom of this and the solution isn't especially pretty....

Is this an external image? Take a look at this MSDN article that explains the permissions needed for retrieving an image:
When the report is previewed in Report Designer, preview uses the
credentials of the user to display the image. When the report is run
on the report server, the report server uses the unattended execution
account to retrieve the image. If the unattended execution account is
not specified, the image is retrieved using no credentials (anonymous
user account). If either of these accounts have insufficient rights to
access the image, the image will not be displayed in the report.
I would check the permissions on the image in the Report Manager.

Related

Is it possible to see which tab is open in the Chrome when your website/web app is open in browser?

I want to create a web app(for practicing my skills) that will help in conducting online exams. So I want to ask that is there any way to find out the following things---
Is there another page opened in the chrome (if yes then which)
Is there is another application running in the background (if yes then which)
Is user switching between tabs/applications/desktops etc.
Basically, I just want to create an app that just keeps track of users' activity when the user is giving an exam.
And if you have any of the solutions to the above problems then please tell.
Since most things you want to access are considered private data, it is not directly possible in a Web App, except the page visibility. But you can write a browser extension, which is at least allowed to access data within the browser. For information beyond the browser you should consider a native application or some embedded solution like React Native, Xamarin, or Electron, to name a few.
To get the info if the user is currently using the tab your Web App is running in, use the Page Visibility API:
https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API
For accessing information about other tabs and browser internal stuff, write an extension:
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API

OpenDocument used from BI launchpad does not access current user session

Issue:
A Dashboard (created in SAP Dashboards) has URL Buttons set up with OpenDocument URLs as links.
When this ‘landing page dashboard’ is opened from the BI Launchpad (whether it’s saved as your default/home page or accessed directly from the platform file structure)… it requires additional authentication to follow an OpenDocument URL. Regardless of file type, Webi documents, or other dashboard files.
Not all users experience this issue, but at least ½ do. Need to understand the difference in behavior and the root cause of it to advise fix.
Referencing OpenDocument user session documentation, there are workarounds with tokens and serialized sessions, but what other settings come into play to explain that only half of the users are impacted and prompted when using native functionality from launchpad?
One possible reason for this behavior is that the domain of the BO server as displayed in the address bar of the browser is different from the domain in the openDocument link.
For example, after logging in to BI launch pad, the browser displays the following in the address bar:
http://bi4server.company.com/BOE/BI
but the openDocument link is:
http://bi4server/BOE/OpenDocument/opendoc.....
In this case, the domain is different so the original session isn't recognized. If this is the case, the easiest solution is to remove the protocol and domain values from the URL, so that it begins with:
/BOE/OpenDocument/opendoc.....

switch report manager URL to report server if access from Ipad

I want to see if it's possible to have only one URL for accessing reporting services from desktop as well as from mobile device like Ipad. Currently we have to use "reportserver" URL if accessing via Ipad. Like to have a more streamlined solution where we can distribute one URL to access reporting services web site and users can use it irrespective of weather they login through mobile device or desktop. Not sure why we need two URLs anyway.
Thanks
This is more of an IIS feature than a Reporting Services feature, but it is achievable. The following guide gives an example of solving a similar issue: http://forums.iis.net/t/1169853.aspx?URL+rewrite+for+Mobile+Cell+phone+devices
Essentially, you need to create a list of URL rewrites in your config file on the webserver that runs SSRS.

SSRS Site Hosting and URL Masking

I'm planning to host a frame web page on a SSRS Report Server, from where users will be able to access the page using the URL similar to the one as follows:
https:\\server\ReportServer?%2fWeb+Page%2fMainFrame.html&rs:Command=GetResourceContents
All the other html pages, images, and reports that the website use are stored in the same path on the Report Server. I was wondering if this itself was an acceptable practice, and would also like to explore the capabilities of URL masking. This is complex because the reports also have objects that allow users to navigate in the web page by using the 'Go to URL' action, with hard-coded URL strings like the one above. The Report Server URL is hence exposed when a user hovers their mouse over a link or an object. Does anyone know a work-around? An ASP.net solution is out of the question and beyond what I can do due to outside constraints. Thanks in advance!

How do I open a report in SSRS 2008 without the user having to provide authentication details?

Summary:
Does anyone know what the minimum we have to do is to get the user to be able to press a button in our app and have the report pop up in an HTML control (Delphi App) with no further input from the user?
Detail:
Authentication is no longer anything to do with IIS in 2008, and a lot of authentication discussion on the web is about IIS and SSRS 2005.
We are looking to display reports within our application and are trying to avoid using the API to re-construct the ReportViewer.
We are hoping to open the reports within an HTML control by passing a URL to the control, along the lines of http://RSServer/ReportServer/ReportDir/ReportName.....
This doesn't work and it looks like it is because the report asks for authentication. We use SQL server authentication for the rest of the app and explicitly want our app installable where domain authentication is patchy at best.
I have enabled Basic authentication which doesn't make much difference, but you don't seem to be able to anable Anonymous Auth, which wouldn't actually be desirable anyway.
Dom.
I've not tried it, but have you looked at this MSDN blog?
EDIT
This may be of more use - it suggests a method of bypassing authentication without running anonymous access
EDIT 2
With basic authorisation enabled, could you simply provide credentials in the URL? - http://username:password#servername/etc/etc?