2012-03-24 11 views
-3

Ich werde einen Web-Service in C# erstellen. Client wird Benutzername und Passwort senden. Ich möchte den Benutzer vor dem Erreichen einer Webmethode, dh in IIS level.Ist es möglich, einen Filter erstellen in C# .Kann jemand pls teilen Sie den Code oder Link.User Details sind in MSSQL-Datenbank gespeichert [Ich möchte einen solchen Benutzer validieren ist in Database.Wenn Benutzer nicht vorhanden ist, dann möchte ich die Anfrage, dort selbst zu blockieren. Zweck ist es, die Validierung des Benutzers in jeder Web-Methode zu vermeiden].So implementieren Sie die Authentifizierung in WebService

+5

"Kann jemand pls den Code oder einen Link teilen": Wie über Sie einige schreiben und dann mit einer echten Frage zurückkommen? –

Antwort

5

Ich würde empfehlen, einen REST-basierten Webservice zu erstellen und über einen API-Schlüssel anstelle von Benutzernamen und Kennwörtern zu senden.

Werfen Sie einen Blick auf: REST GET requests, verbs and apikey

Dann einfach Google REST basierte ASP.NET Webservices für jede Menge Tutorials, wie es zu erreichen.

Implementierung zeigen

Hinweis aktualisiert: Ich nicht die Originalseite aber dieser Code basierte irgendwo eine Probe finden.

Schritt 1 - Bearbeiten web.config

dies im Abschnitt system.serviceModel ein.

<behaviors> 
    <serviceBehaviors> 
    <clear /> 
    <behavior> 
     <!-- This behavior enables API Key Verification --> 
     <serviceAuthorization serviceAuthorizationManagerType="API.APIKeyAuthorization, API" /> 
     <serviceMetadata httpGetEnabled="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

Schritt 2 - API Berechtigungsklasse erstellen

Ändern Sie den Code in IsValidAPI Schlüssel Ihre aktuelle Situation anzupassen. Sie können sehen, dass meins zu einer Funktion geht, um zu testen, ob der API-Schlüssel gültig ist.

namespace API 
{ 
public class APIKeyAuthorization : ServiceAuthorizationManager 
{ 
    public const string APIKEY = "APIKey"; 
    public const string APIKEYLIST = "APIKeyList"; 

    protected override bool CheckAccessCore(OperationContext operationContext) 
    { 
     return IsValidAPIKey(operationContext); 
    } 

    public bool IsValidAPIKey(OperationContext operationContext) 
    { 
     // if verification is disabled, return true 
     if (Global.APIKeyVerification == false) 
      return true; 

     string key = GetAPIKey(operationContext); 

     // Convert the string into a Guid and validate it 
     if (BusinessLogic.User.ApiKey.Exists(key)) 
     { 
      return true; 
     } 
     else 
     { 
      // Send back an HTML reply 
      CreateErrorReply(operationContext, key); 
      return false; 
     } 
    } 

    public string GetAPIKey(OperationContext operationContext) 
    { 
     // Get the request message 
     var request = operationContext.RequestContext.RequestMessage; 

     // Get the HTTP Request 
     var requestProp = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]; 

     // Get the query string 
     NameValueCollection queryParams = HttpUtility.ParseQueryString(requestProp.QueryString); 

     // Return the API key (if present, null if not) 
     return queryParams[APIKEY]; 
    } 

    private static void CreateErrorReply(OperationContext operationContext, string key) 
    { 
     // The error message is padded so that IE shows the response by default 
     using (var sr = new StringReader("<?xml version=\"1.0\" encoding=\"utf-8\"?>" + APIErrorHTML)) 
     { 
      XElement response = XElement.Load(sr); 
      using (Message reply = Message.CreateMessage(MessageVersion.None, null, response)) 
      { 
       HttpResponseMessageProperty responseProp = new HttpResponseMessageProperty() { StatusCode = HttpStatusCode.Unauthorized, StatusDescription = String.Format("'{0}' is an invalid API key", key) }; 
       responseProp.Headers[HttpResponseHeader.ContentType] = "text/html"; 
       reply.Properties[HttpResponseMessageProperty.Name] = responseProp; 
       operationContext.RequestContext.Reply(reply); 
       // set the request context to null to terminate processing of this request 
       operationContext.RequestContext = null; 
      } 
     } 
    } 

    public const string APIErrorHTML = @" 
<html> 
<head> 
    <title>Request Error - No API Key</title> 
    <style type=""text/css""> 
     body 
     { 
      font-family: Verdana; 
      font-size: x-large; 
     } 
    </style> 
</head> 
<body> 
    <h1> 
     Request Error 
    </h1> 
    <p> 
     A valid API key needs to be included using the apikey query string parameter 
    </p> 
</body> 
</html> 
"; 
    } 
} 

API Genehmigung erfolgt, bevor Sie sogar die Web-Methode treffen. In diesem Beispiel wird jedoch der API-Schlüssel als Querystring übergeben. Befolgen Sie weitere Beispiele im obigen Link, um dies über HTTP-Header zu ändern. Ein sauberer Ansatz, der Ihre URLs nicht durcheinanderbringt. Aber das hängt alles von Ihren Anforderungen ab.

aktualisieren Eigentlich kam ich nur über diese: Microsoft ASP.NET Web API - http://www.asp.net/web-api

Versuchen Sie, dass :)

+0

Mein Zweifel ist, wie man die Anfrage behandelt, bevor es zur Webmethode erreicht. – user922834

Verwandte Themen