.net 为请求网页传递不同的网络凭据

.net 为请求网页传递不同的网络凭据,.net,asp.net-mvc,.net,Asp.net Mvc,我使用两个不同的应用程序(应用程序A和应用程序B),它们托管在两个不同的服务器上。应用程序A是普通用户应用程序,应用程序B仅用于查看SSRS报告 现在,在应用程序A中,我有一个页面,在其中我将应用程序B的URL嵌入到iframe中,它将根据URL参数在iframe中加载报告 这个应用程序B是高度安全的,只允许一个用户(假设用户是surendra)。所以,如果应用程序A在不同的计算机中访问,则该计算机的凭据将作为网络凭据传递给应用程序A,以加载特定的报告。但应用程序B只允许特定的用户,所以它将通过

我使用两个不同的应用程序(应用程序A和应用程序B),它们托管在两个不同的服务器上。应用程序A是普通用户应用程序,应用程序B仅用于查看SSRS报告

现在,在应用程序A中,我有一个页面,在其中我将应用程序B的URL嵌入到iframe中,它将根据URL参数在iframe中加载报告

这个应用程序B是高度安全的,只允许一个用户(假设用户是surendra)。所以,如果应用程序A在不同的计算机中访问,则该计算机的凭据将作为网络凭据传递给应用程序A,以加载特定的报告。但应用程序B只允许特定的用户,所以它将通过拒绝访问错误

不允许应用程序B更改用户访问权限或更改任何代码。有没有办法解决这个问题

当iframe请求应用程序B的url以便授予访问权限并且任何用户都可以看到该报告时,是否有任何类似的方法可以传递特殊凭据(用户surendra),对用户的机器没有依赖性

我可以将此凭据存储在应用程序A的配置详细信息中,并使用它们仅从应用程序B获取报告


请告诉我任何其他解决方法。

iframe无法传递特定凭据,只能传递查询字符串中的参数。解决方案是让iframe请求应用程序A中的一个操作,在该操作中,您可以使用所需的网络凭据(surendra)从B请求报告,然后将结果返回到iframe

例如,在应用程序A中更改iframe:

<iframe src="@Url.Action("GetReport", "Home", new { reportUrl = "http://applicationB/report/parameters" })"></iframe>

然后在应用程序A中添加一个操作,使用所需的凭证从B获取报告。比如:

public ActionResult GetReport(string reportUrl)
{
    Uri uri = new Uri(reportUrl);
    var request = WebRequest.CreateHttp(uri );
    //use specific credential to retrieve report
    request.Credentials = new NetworkCredential("surendra", "pwd", "domain");
    var response = request.GetResponse();

    using (var sr = new System.IO.StreamReader(response.GetResponseStream()))
    {
        var html = sr.ReadToEnd();

        //add <base> tag in the header so that the resources resolve at the base of the target domain
        var baseTag = string.Format("<base href='{0}://{1}'> ", uri.Scheme, uri.Host);
        html = html.Insert(html.IndexOf("<head>", StringComparison.InvariantCultureIgnoreCase) + 6, baseTag);

        return Content(html);
    }
}
public ActionResult GetReport(string reportUrl)
{
Uri=新的Uri(reportUrl);
var-request=WebRequest.CreateHttp(uri);
//使用特定凭据检索报告
request.Credentials=newnetworkcredential(“surendra”、“pwd”、“domain”);
var response=request.GetResponse();
使用(var sr=new System.IO.StreamReader(response.GetResponseStream())
{
var html=sr.ReadToEnd();
//在标头中添加标记,以便在目标域的底部解析资源
var baseTag=string.Format(“”,uri.Scheme,uri.Host);
html=html.Insert(html.IndexOf(“”,StringComparison.InvariantCultureIgnoreCase)+6,baseTag);
返回内容(html);
}
}

您是否可以修改应用程序A?它是ASP.NET MVC应用程序吗?应用程序B的URL包含报告的参数,这些参数是在客户端(浏览器)中动态生成的吗?我们只能修改请求报告的应用程序A,并将该URL嵌入应用程序A的iframe中。应用程序A是MVC应用程序。应用程序B的报告URL是从应用程序A动态生成的,应用程序B将读取这些参数并返回特定的报告。我们没有在URL内传递任何凭据。报表URL将是另一个应用程序的URL。因此,根据上述解决方案,可以加载html,但不会加载支持css或js文件。所以它不会起作用。请参阅我的更新答案。这仍然可行,但有点棘手。通过在返回html内容的
中插入
标记,它将告诉浏览器根据报表url的域解析资源库。但是,如果报表html页面执行客户端重定向,则该技巧将失败。