Ich habe gerade angefangen, WCF-Dienste mit ASP.NET AJAX zu verwenden. Ich instanziere meinen WCF-Dienst aus Javascript und übergebe dann String-Variablen als Argumente an meine WCF-Dienst-Methode (mit einer OperationContract-Signatur). Ich gebe dann ein .NET-Objekt zurück (definiert mit einem DataContract), das an meine eigene Javascript-Klasse gebunden ist. Ich habe Probleme bei der Authentifizierung auf der Grundlage des Benutzers, der in meiner Web-Sitzung angemeldet ist. Der WCF-Webdienst ist jedoch ein völlig anderer Dienst ohne Kontext zum HttpContext.Current-Objekt. Was ist der sicherste Weg, um Zugriff auf dieses Objekt zu erhalten?
Antworten
Zu viele Anzeigen?Sie können Zugang erhalten zu HttpContext.Current
durch Aktivierung von AspNetCompatibility, vorzugsweise über die Konfiguration:
<configuration>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
</configuration>
Dies wiederum ermöglicht Ihnen den Zugriff auf den aktuellen Benutzer: HttpContext.Current.User
- Das ist doch das, was Sie wollen, oder?
Sie können AspNetCompatibility sogar erzwingen, indem Sie Ihre Serviceklasse mit einem zusätzlichen Attribut ausstatten:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
(In der System.ServiceModel.Activation
Namespace). Wenn dieses Attribut vorhanden ist, wird Ihr Dienst nicht starten, es sei denn, AspNetCompatibility ist aktiviert!
Sie haben standardmäßig keinen HttpContext, aber Sie haben viele der gleichen Objekte im OperationContext (der immer vorhanden ist) oder im WebOperationContext (der nur für bestimmte Bindungen verfügbar ist).
Sie können auf den OperationContext oder WebOperationContext zugreifen, indem Sie die statische .Current
Eigenschaft wie folgt: WebOperationContext.Current
Falls Sie die Web.config nicht ändern wollen oder können, können Sie sie auch nicht ändern:
private string GetClientIPAddress()
{
var props = OperationContext.Current.IncomingMessageProperties;
var endpointProperty = props[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
if (endpointProperty != null)
{
if (endpointProperty.Address == "::1" || String.IsNullOrEmpty(endpointProperty.Address))
return "127.0.0.1";
return endpointProperty.Address;
}
return String.Empty;
}