I want to connect .net 8.0 with ssrs and get the rendered pdf bytes from report server, my micro service is running in aws ecs linux docker
the ssrs report server accepts ntlm auth but which is said to be not working correctly in linux containers
i had got this solution
gss-ntlmssp libgssapi-krb5-2 krb5-user to install in the docker but which is also said by most gpts not a full working solution, the other solution is using a proxy api in windows container
but i cannot have two service working ,kindly let me know full proof solution
Loading
Jim ParsonPosted Jan 27, 2026, 10:13 AM
my code
[HttpGet("render-cc-welcome-letter")]
[ProducesResponseType(typeof(FileContentResult), 200)]
[ProducesResponseType(typeof(ProblemDetails), 500)]
public async Task RenderCcWelcomeLetterAsync()
{
const string reportPath = "/Reports/Letters/Letters_AR/CC_Welcome Letter";
var parameters = new Dictionary
{
["AssessmentDate"] = "1/4/2026",
["CaseID"] = "6941795",
["Recipients"] = "18261413"
};
try
{
// ---------------- Binding ----------------
var binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly)
{
MaxReceivedMessageSize = int.MaxValue,
ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max,
AllowCookies = true
};
// Use NTLM for SSRS when running under Windows authentication
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
var endpoint = new EndpointAddress(this.reportingOptions.Url);
var client = new ReportExecutionServiceSoapClient(binding, endpoint);
// ---------------- Credentials ----------------
// Supports:
// 1) Username = "domain\\user" (e.g. "mydomain\\reportuser")
// 2) Username = "user" + optional Domain
// 3) No Username => DefaultNetworkCredentials (local dev)
var username = this.reportingOptions.Username?.Trim();
var password = this.reportingOptions.Password ?? string.Empty;
if (!string.IsNullOrWhiteSpace(username))
{
if (username.Contains("\\"))
{
var parts = username.Split('\\', 2);
var domain = parts[0];
var user = parts[1];
client.ClientCredentials.Windows.ClientCredential =
new System.Net.NetworkCredential(user, password, domain);
}
else
{
client.ClientCredentials.Windows.ClientCredential =
string.IsNullOrWhiteSpace(this.reportingOptions.Domain)
? new System.Net.NetworkCredential(username, password)
: new System.Net.NetworkCredential(username, password, this.reportingOptions.Domain);
}
}
else
{
client.ClientCredentials.Windows.ClientCredential =
System.Net.CredentialCache.DefaultNetworkCredentials;
}
client.ClientCredentials.Windows.AllowedImpersonationLevel =
System.Security.Principal.TokenImpersonationLevel.Impersonation;
// Note: AllowNtlm is not available in .NET Core WCF; NTLM is enabled via ClientCredentialType
var trustedHeader = new TrustedUserHeader();
// ---------------- 1) Load Report ----------------
var loadResponse = await client.LoadReportAsync(
trustedHeader,
reportPath,
null); // HistoryID
var executionId = loadResponse.ExecutionHeader.ExecutionID;
// ---------------- 2) Set Parameters ----------------
ParameterValue[] paramArray = parameters
.Select(p => new ParameterValue
{
Name = p.Key,
Value = p.Value
})
.ToArray();
await client.SetExecutionParametersAsync(
new ExecutionHeader { ExecutionID = executionId },
trustedHeader,
paramArray,
"en-us");
// ---------------- 3) Render PDF ----------------
var renderRequest = new RenderRequest
{
ExecutionHeader = new ExecutionHeader { ExecutionID = executionId },
TrustedUserHeader = trustedHeader,
Format = "PDF",
DeviceInfo = null
};
var renderResponse = await client.RenderAsync(renderRequest);
return this.File(
renderResponse.Result,
"application/pdf",
"CC_WelcomeLetter.pdf");
}
catch (Exception ex)
{
var root = ex;
while (root.InnerException != null)
{
root = root.InnerException;
}
this.logger.LogError(
ex,
"SSRS rendering failed. Url={Url}, User={User}, Root={RootMessage}",
this.reportingOptions.Url,
this.reportingOptions.Username,
root.Message);
return this.Problem(
detail: $"{ex.Message} | Root: {root.Message}",
statusCode: 500,
title: "SSRS rendering error");
}
}