2009-08-09 7 views
0

ich einen Web-Service erstellt habe und einen SOAP-Header für die Authentifizierung verwenden, wie hier beschrieben: http://aspalliance.com/805eine XML Web Service Ausnahme für ungültig Benutzername Werfen/Passwort

ich es angepasst haben, so dass in jedem Methode, ruft es eine separate "authenticate" -Methode auf, die den Benutzernamen und das Passwort in der db sucht und true oder false zurückgibt. Meine Frage ist, innerhalb dieser Methode, wenn es false zurückgibt (dh der Benutzer ist nicht validiert) Wie sollte ich eine Ausnahme werfen, die zurück in die Verbraucheranwendung filtert?

Antwort

0

Als Erstes sollten Sie eine Operation Login hinzufügen, die Ihren Benutzernamen/Passwort-Header als Eingabe verwendet, den Benutzer authentifiziert und dann ein Autorisierungstoken in einem SOAP-Header zurückgibt. Dieser Header sollte dann in allen folgenden Operationen wie im Eingabe-Header angegeben werden.

Zweitens sollten Sie eine SOAPException auslösen. Dies wird mehr oder weniger direkt in einen SOAP-Fehler übersetzt. Ein SOAP-Fehler ist die geeignete Methode, um einen Fehler bei einer Web-Service-Operation anzuzeigen, aus dem gleichen Grund, dass Ausnahmen besser sind als der Status einer normalen Methode - Sie müssen den Rückgabe-Status zum Zeitpunkt des Aufrufs nicht überprüfen.

Schließlich wussten Sie, dass Microsoft ASMX-Webdienste als "Legacy" -Code deklariert hat und dass sie keine Bugs mehr reparieren? Es ist Zeit, zu WCF zu wechseln.

0

i Seife Ausnahmen für die Anmeldung verwendet haben versagt:

[WebMethod] 
    [SoapHeader("authentication")] 
    public User Authenticate() 
    { 
     try 
     { 
      authentication.Roles = new string[] { UserRoles.Users }; 
      ConfigureAuthentication(); 
      Service<ISecurity>.Interface.Authenticate(); 
      Guid userId = Service<ISecurity>.Interface.GetUserId(authentication.UserName); 
      return Service<IObjectRetriever>.Interface.Retrieve<User>(userId); 
     } 
     catch (Exception ex) 
     { 
      WriteException(ex); 
      throw new SoapException(ex.Message, new XmlQualifiedName(SoapException.ServerFaultCode.Name), ex); 
     } 
    } 
+0

-1 für 'Exception' zu kontrollieren. Das ist zu allgemein eine Ausnahme, um zu fangen, Sie haben keine Ahnung, was passiert ist, und dann drehen Sie sich um und übergeben Sie die unbekannte Nachricht zurück an den Client! Du würdest genauso gut "WriteException (ex); throw;" machen, was zumindest den Stapel-Trace erhalten würde! –