Authentifizierung im CoreWCF-ServerC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Authentifizierung im CoreWCF-Server

Post by Anonymous »

Ich migriere derzeit eine .NET 4.8 -Anwendung, in der mehrere REST -APIs und WCF -Schnittstellen auf ASP.NET Core (.NET 8) gehostet werden. Um die WCF -Schnittstellen zu migrieren, verwende ich CoreWCF.

Code: Select all

 using (HttpClientHandler handler = new HttpClientHandler())
{
handler.UseDefaultCredentials = true;

using (HttpClient client = new HttpClient(handler))
{
var response = client.GetAsync($"https://localhost:44375/api/interfaces").Result;
}
}
< /code>
Der Server wird in IIS Express für die Entwicklung gehostet und sollte bei der Bereitstellung auf einem IIS -Server ausgeführt werden. Aber das ist jetzt nicht das Problem. private static void EnsureWCFServiceBindings()
{
if (transportBinding == null)
{
XmlDictionaryReaderQuotas readerQuotas = new XmlDictionaryReaderQuotas();
readerQuotas.MaxDepth = 2147483647;
readerQuotas.MaxStringContentLength = 2147483647;
readerQuotas.MaxArrayLength = 2147483647;
readerQuotas.MaxBytesPerRead = 2147483647;
readerQuotas.MaxNameTableCharCount = 2147483647;

HttpTransportSecurity httpTransportSecurity = new HttpTransportSecurity();
httpTransportSecurity.ClientCredentialType = HttpClientCredentialType.Ntlm;
httpTransportSecurity.ProxyCredentialType = HttpProxyCredentialType.Ntlm;
httpTransportSecurity.Realm = "mydomain.com";

BasicHttpMessageSecurity basicHttpMessageSecurity = new BasicHttpMessageSecurity();
basicHttpMessageSecurity.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
basicHttpMessageSecurity.AlgorithmSuite = SecurityAlgorithmSuite.Default;

BasicHttpsSecurity basicHttpsSecurity = new BasicHttpsSecurity
{
Mode = BasicHttpsSecurityMode.Transport,
Transport = httpTransportSecurity,
Message = basicHttpMessageSecurity
};

BasicHttpsBinding basicHttpsBinding = new BasicHttpsBinding
{
CloseTimeout = TimeSpan.FromMinutes(5),
OpenTimeout = TimeSpan.FromMinutes(5),
ReceiveTimeout = TimeSpan.FromMinutes(10),
SendTimeout = TimeSpan.FromMinutes(5),
AllowCookies = false,
BypassProxyOnLocal = false,
HostNameComparisonMode = HostNameComparisonMode.StrongWildcard,
MaxBufferSize = 2147483647,
MaxBufferPoolSize = 0,
MaxReceivedMessageSize = 2147483647,
MessageEncoding = WSMessageEncoding.Text,
TextEncoding = Encoding.UTF8,
TransferMode = TransferMode.Buffered,
ReaderQuotas = readerQuotas,
Security = basicHttpsSecurity
};
transportBinding = basicHttpsBinding;
}

if (clientBuildClient == null)
{
clientBuildClient = new EndpointAddress(string.Format("{0}{1}", "https://localhost:44375/", "BuildClient.svc"));
}
}
< /code>
und der Anruf zum Server erfolgt mit dem folgenden Code: < /p>
MyCommunicationClient myClient = new MyCommunicationClient (WCFBindings.TransportBinding, WCFBindings.EndPointBuildClient));
ResultObject response = myClient.CallService(serviceRequestParameter);
Wenn ich diesen WCF -Anruf mit dem migrierten Dienst versuche, erhalte ich einen httpstatuscode 401.
Die aktuelle Konfiguration des migrierten Server

Code: Select all

builder.Services.AddHttpContextAccessor();
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
.AddNegotiate();

builder.Services.AddAuthorization(options =>
{
options.FallbackPolicy = options.DefaultPolicy;
options.AddPolicy("RequireWindowsAuth", policy =>
{
policy.RequireAuthenticatedUser();
policy.AddAuthenticationSchemes(NegotiateDefaults.AuthenticationScheme);
});
});

builder.WebHost.UseIISIntegration();
// some more code here
app.UseServiceModel(serviceBuilder =>
{
serviceBuilder.AddService((serviceOptions) => { })
.AddServiceEndpoint(new BasicHttpBinding
{
Security = new BasicHttpSecurity
{
Mode = BasicHttpSecurityMode.Transport,
Transport = new HttpTransportSecurity
{
ClientCredentialType = HttpClientCredentialType.Windows,
AlwaysUseAuthorizationPolicySupport = true,
Realm = "mydomain.com"
}
}
}, "/BuildClient.svc");
});

var serviceMetadataBehavior = app.Services.GetRequiredService();
serviceMetadataBehavior.HttpGetEnabled = true;
serviceMetadataBehavior.HttpsGetEnabled = true;

IHttpContextAccessor httpContextAccessor = app.Services.GetRequiredService();
IdentityProvider.Configure(httpContextAccessor);

app.UseAuthentication();
app.UseAuthorization();
< /code>
Die Konfiguration für den IIS Express lautet: < /p>
{
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": false,
"iisExpress": {
"applicationUrl": "http://localhost:50228",
"sslPort": 44375
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
},
"BuildService": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:50228;https://localhost:44375",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
< /code>
Mit diesem Setup erhalte ich den bereits genannten 401 HTTP -Statuscode. Wenn ich die AddAuthentication 
ändere, um so zu sehen:

Code: Select all

builder.Services.AddAuthentication("Ntlm")
.AddScheme("Ntlm", options =>
{
options.Domain = "mydomain.com";
}).AddNegotiate();
wobei der ntlmmauthenticationHandler Folgendes enthält:
protected override async Task HandleAuthenticateAsync()
{
var user = Context.User;
var user2 = IdentityProvider.Current;
}
< /code>
Wenn ich den Benutzer oder den Benutzer2-Variable anschaue, während die Authentifizierung in der Restanforderung angezeigt wird, dass ich authentifiziert bin und meine Benutzer-ID bereitgestellt wird. In der WCF -Anforderung gibt es keine Benutzer -ID und die Anforderung ist nicht authentifiziert. Benötigen Sie weitere Informationen über den Server oder den Client, ich kann ihn bereitstellen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post