我有要求從我的MVC 6控制器生成一個SSRS報告服務器端,我目前正在嘗試獲得穩定的解決方案。我遇到了一段時間我的c#代碼會成功通過SSRS報告服務器進行身份驗證,然後突然它會給我401 http
響應,而無需進行任何配置或代碼更改,這幾乎就像我已經通過身份驗證並且連接是堅持,然後在一段時間後,它會否認我。今天早上,當我再次開始了我的測試應用程序,我驗證和生成的報告有一個良好的30個礦山開始之前,我得到401級的響應SSRS報告身份驗證間歇性工作
這裏是我的rsreportserver.config
文件的設置
<Authentication>
<Extension Name="Windows" Type="Microsoft.ReportingServices.Authentication.WindowsAuthentication, Microsoft.ReportingServices.Authorization"/>
</Authentication>
<Authentication>
<AuthenticationTypes>
<RSWindowsNTLM/>
</AuthenticationTypes>
<RSWindowsExtendedProtectionLevel>Off</RSWindowsExtendedProtectionLevel>
<RSWindowsExtendedProtectionScenario>Proxy</RSWindowsExtendedProtectionScenario>
<EnableAuthPersistence>true</EnableAuthPersistence>
</Authentication>
,這是我如何努力從c#驗證,如果有更好的方法來做到這一點,請等我知道
public async Task<byte[]> Generate
(
string reportServerUrl,
string reportData,
string username,
string password
)
{
var reportUrl = [email protected]"{reportServerUrl}//ReportServer/Pages/ReportViewer.aspx{reportData}";
using (var handler = new HttpClientHandler { Credentials = new NetworkCredential(username, password, [email protected]"{reportUrl}/") })
{
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri(reportServerUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("Authorization", "NTLM");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.GetAsync(reportUrl);
if (response.IsSuccessStatusCode)
{
return response.Content.ReadAsByteArrayAsync().Result;
}
}
}
return null;
}
您可以將用戶憑據存儲在應用設置中,以便在運行所有報告時使用,並在獲取數據時將用戶數據權限作爲報告參數進行管理。另外,您是否嘗試在[Authenticate]的方法上添加合約標記來強制應用程序檢查它是否具有憑據? – Mike
嗨,@ Mmcgowa3,謝謝你的回覆。你有合同標記的示例代碼嗎?我不確定你的意思。 – user65439
我想念說這個標記實際上叫做[Authorize],你可以在控制器類的頂部或單獨的方法中使用該標記。 – Mike