none
ASP.NET MVC und Http403 RRS feed

  • Frage

  • Hi,

    aus einer ASP.NET MVC Anwendung wird ein REST Service konsumiert. Proxy-Klassen wurden generiert. Im Controller, in einer mit [HttpGet] dekorierten Methode rufe ich zunächst eine Login-Methode auf, die mit einem "Success" quittiert wird.

    Direkt im Anschluss versuche ich mehrere Elemente abzurufen und erhalte eine nachstehende Ausnahme.

    Warum bekomme ich die Ausnahme, wenn ich mich zuvor erfolgreich angemeldet habe?

    [HttpGet]
    public JsonResult LoginStatus(string username, string password)
    
    var credentials = new LoginCredential
    {
     UserName = username,
     Password = password,
     Port = Properties.Settings.Default.Port,
     Server = Properties.Settings.Default.Server
    };
    
    _myRestClient.ClientCredentials.UserName.UserName = username;
    _myRestClient.ClientCredentials.UserName.Password = password;
    
    var info = _restClient.Login(credentials); // <= OK
    
    var inputGet = new InputGet
    { // Hier werden Filterparameter angegeben
    };
    
    var tickets = _restClient.Get(inputGet); // <= FEHLER

    Die Exception:

    System.ServiceModel.Security.MessageSecurityException
      HResult=0x80131501
      Nachricht = Die HTTP-Anforderung wurde mit Clientauthentifizierungsschema "Anonymous" nicht zugelassen.
      Innere Ausnahme 1:
    WebException: Der Remoteserver hat einen Fehler zurückgegeben: (403) Unzulässig.

    Vielen Dank und viele Grüße,
    Christian


    Dienstag, 19. März 2019 19:39

Alle Antworten

  • Hallo Christian,

    ohne den entfernten Service zu kennen, können wir dir das auch nicht sagen. Wir haben keinen Schimmer, was "InputGet", ... ist, wie das aufgebaut ist, auf welchem Weg der Service die Authorisierungsdaten (nach dem Login, also in deinem Fall bei "Get") erhalten will, usw.

    Wenn das bspw. per JWT gemacht wird, muss natürlich das Token passend übergeben werden. Wenn was anderes, sollte das auch in der Doku stehen, ...

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Mittwoch, 20. März 2019 08:29
    Moderator
  • Hallo Stefan,

    ich habe inzwischen Zugriff auf den Quellcode von dem REST-Service. Der REST-Service ruft Daten von einem ERP-System ab. Die Zugangsdaten für das ERP-System werden von der ASP.NET MVC Anwendung übertragen.

    var credentials = new LoginCredential <= ERP-Zugangsdaten
    {
     UserName = username,
     Password = password,
     Port = Properties.Settings.Default.Port,
     Server = Properties.Settings.Default.Server
    };
    
    _myRestClient.ClientCredentials.UserName.UserName = username;
    _myRestClient.ClientCredentials.UserName.Password = password;
    
    var info = _restClient.Login(credentials);

    Der REST-Service erstellt erfolgreich eine Verbindung zu dem ERP-System und vermerkt sich die Objektinstanz des Zugriffsobjekts in 

    _context["USERLOGGEDIN"]=ZugriffsobjektAufERP

    Die Instanzvariable _context wird im Konstruktor des REST-Service wie folgt instanziiert.

    private MyCtor()
    {
     _context = HttpContext.Current;
    }

    Beim Aufruf von 

    var info = _restClient.Login(credentials);

    sehe ich am REST-Service, dass ein neues Objekt der REST-Service-Klasse instanziiert wird. Im HttpContext.Current ist zu sehen, dass die Session-ID eine andere ist.

    Jetzt stellt sich die Frage, wie gewährleistet wird, dass beim nächsten Zugriff auf den REST-Service die gleiche Session wiederverwendet wird. Oder sollte die Session-ID vom REST-Service nach erfolgreichem Log-In an die ASP.NET MVC Anwendung geliefert werden, damit dieser die Session-ID bei den zukünftigen Requests mit überträgt? Dann wäre die Frage, wie er REST-Service anhand der Session-ID, über welche Klasse auch immer, sich diese beschafft. 

    Oder sollte das ERP-Zugriffsobjekt im HttpApplicationState vermerkt werden und der Schlüssel zum Client (ASP.NET MVC) zurück gegeben werden? Die nachstehenden Anfragen könnten, d.h. _restClient.Get(..) müssten die gelieferte ID in den Request übergeben.

    Gibt es ein übliches Handling für einen solchen Fall?

    Viele Grüße,
    Christian


    • Bearbeitet ChristianHavel Montag, 25. März 2019 17:02 Vervollständigung
    Montag, 25. März 2019 16:48