レポートを SSRS インスタンスにデプロイするために作成した C# アプリケーションがあります。それはうまくいっています。セキュリティを向上させるために、SSRS を NT AUTHORITY\NETWORK SERVICE アカウントの使用から専用のドメイン アカウントの使用に変更することにしました。この変更には、Reporting Services 構成マネージャーを使用しました。今、私のアプリは MessageSecurityException をスローします:
HTTP 要求は、クライアント認証方式 'Negotiate' では許可されていません。The authentication header received from the server was 'Negotiate oYGEMIGBoAMKAQGiegR4YHYGCSqGSIb3EgECAgMAfmcwZaADAgEFoQMCAR6kERgPMjAxMjA3MjQxNzIyNTBapQUCAwUAuaYDAgEpqQ4bDFZFUlRFWC5MT0NBTKoqMCigAwIBA6EhMB8bBGhvc3QbF3Z0eC1kZXYtMDEudmVydGV4LmxvY2Fs'.
次のメソッドを呼び出します。
public static ReportService.ReportingService2010SoapClient Connect(StreamWriter logFile, string reportingServicesUri)
{
//Connect with the user's Windows credentials
try
{
BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
basicHttpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
basicHttpBinding.SendTimeout = new TimeSpan(0, 10, 0);
EndpointAddress endpoint = new EndpointAddress(reportingServicesUri);
var rs = new ReportService.ReportingService2010SoapClient(basicHttpBinding, endpoint);
rs.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
rs.ChannelFactory.Credentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
return rs;
}
catch (UriFormatException)
{
Common.WriteToLog(logFile, "Connect: " + reportingServicesUri + " does not point to a valid SSRS instance.", false);
}
return null;
}
次に、このメソッドを呼び出します (ここで例外がキャッチされます)。
private static CatalogItem FindFirstItem(ReportingService2010SoapClient rs, StreamWriter logFile, String itemPath, String itemName)
{
CatalogItem[] items;
var itemsNames = new string[] { itemName };
string indentText = "";
Console.WriteLine(indentText + "Searching for " + itemPath + '/' + itemName + "...");
try
{
TrustedUserHeader userHeader = new TrustedUserHeader();
var properties = new Property[1];
properties[0] = new Property();
properties[0].Name = "Recursive";
properties[0].Value = "false";
var conditions = new SearchCondition[1];
conditions[0] = new SearchCondition();
conditions[0].Condition = ConditionEnum.Equals;
conditions[0].ConditionSpecified = true;
conditions[0].Name = "Name";
conditions[0].Values = itemsNames;
rs.FindItems(userHeader, "/" + itemPath, BooleanOperatorEnum.And, properties, conditions, out items);
if (items.Length == 0)
return null;
return items[0];
}
catch (FaultException e)
{
if (!e.Message.Contains("cannot be found"))
Common.WriteToLog(logFile, "FindFirstItem: " + e.Message, false);
}
catch (MessageSecurityException e)
{
throw;
}
return null;
}
ブラウザーでレポート マネージャーの URL を使用して、この SSRS インスタンスのデータ ソースに引き続きアクセスできます。私のアプリは、サービス アカウントとして NT AUTHORITY\NETWORK SERVICE を使用する SSRS インスタンスで引き続き動作します。この SSRS インスタンスでこのアプリを再び動作させるにはどうすればよいですか?