Basisauthentifizierung für WCF-Dienste in .Net Core

Dieses Beispiel fügt den Header über einen MessageInspector und EndpointBehavior ein, womit der Client sehr flexibel eingesetzt werden kann.
Folgende Klassen sind erforderlich.

    public class HttpBasicAuthMessageInspector : IClientMessageInspector
    {
        private string BasicAuth = "";

        public HttpBasicAuthMessageInspector(string ThisBasicAuth)
        {
            BasicAuth = ThisBasicAuth;
        }

        public void AfterReceiveReply(ref Message reply, object correlationState)
        {
        }

        public object BeforeSendRequest(ref Message request, System.ServiceModel.IClientChannel channel)
        {
            HttpRequestMessageProperty HttpRequestMessage;

            if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out object HttpRequestMessageObject))
            {
                HttpRequestMessage = HttpRequestMessageObject as HttpRequestMessageProperty;

                if (string.IsNullOrEmpty(HttpRequestMessage.Headers[HttpRequestHeader.Authorization]))
                    HttpRequestMessage.Headers[HttpRequestHeader.Authorization] = BasicAuth;
            }
            else
            {
                HttpRequestMessage = new HttpRequestMessageProperty();
                HttpRequestMessage.Headers.Add(HttpRequestHeader.Authorization, BasicAuth);
                request.Properties.Add(HttpRequestMessageProperty.Name, HttpRequestMessage);
            }

            return null;
        }
    }

 

    public class HttpBasicAuthEndpointBehavior : IEndpointBehavior
    {
        private string BasicAuth = "";

        public HttpBasicAuthEndpointBehavior(string ThisBasicAuth)
        {
            BasicAuth = ThisBasicAuth;
        }

        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
            HttpBasicAuthMessageInspector Inspector = new HttpBasicAuthMessageInspector(BasicAuth);
            clientRuntime.ClientMessageInspectors.Add(Inspector);
        }

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
        }

        public void Validate(ServiceEndpoint endpoint)
        {
        }
    }

 

Für die Verwendung wird dem Client dann nur noch das Verhalten hinzugefügt.

string BasicAuth = "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(Client.ClientCredentials.UserName.UserName + ":" + Client.ClientCredentials.UserName.Password));
Client.Endpoint.EndpointBehaviors.Add(new HttpBasicAuthEndpointBehavior(BasicAuth));

 

Dieser Ansatz eignet sich auch für andere Header, die standardmäßig einem Client hinzugefügt werden sollen.

Please publish modules in offcanvas position.