2016-09-27 2 views
0

ich meine Web-API-2-Projekt konfiguriert haben mit OAuth arbeiten mit OWINErste Authorization wurde für diesen Antrag abgelehnt

public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      ConfigureOAuth(app); 

      HttpConfiguration config = new HttpConfiguration(); 
      WebApiConfig.Register(config); 
      app.UseWebApi(config); 
     } 

     public void ConfigureOAuth(IAppBuilder app) 
     { 

      OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() 
      { 

       AllowInsecureHttp = true, 
       TokenEndpointPath = new PathString("/token"), 
       AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 
       Provider = new MyAuthorizationServerProvider() 
      }; 

      // Token Generation 
      app.UseOAuthAuthorizationServer(OAuthServerOptions); 

      app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 

     } 

    } 

Die Umsetzung MyAuthorizationServerProvider:

public class MyAuthorizationServerProvider : OAuthAuthorizationServerProvider 
{ 
    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     context.Validated(); 
    } 

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     var repo = new AuthRepository(); 
     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); 

     var user = repo.ValidateUserCredentials(context.UserName, context.Password); 

     if (user == null) 
     { 
      context.SetError("invalid_grant", "The user name or password is incorrect."); 
      return; 
     } 

     var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
     identity.AddClaim(new Claim("sub", context.UserName)); 
     identity.AddClaim(new Claim("role", "user")); 

     context.Validated(identity); 
    } 
} 

Ich bin in der Lage ein erhalten Token .. Dann sende ich es an einen Controller mit [Authorized] dekoriert und immer noch

{ 
    "message": "Authorization has been denied for this request." 
} 
hier

Die Request-Header mit Token:

Content-Type:application/json 
Authorization:Bearer m6ukGHOmp_MgM6rsb70n8Rd_BlBEXbgyPNr5ZNzGzkm__7zdntVPYAMAhFPXVdw1S6-ohv960c6mzMMwkY0G_AL-2uIq2aOjkoojxDPKuITuml8sgC4ng0KC2AqUFrBBEn0eCsSAnc3UK_jyKSB59Ao_eL9JPoJHoJHP-xBs42KGAGl4iKdYtzdfg2zY0Ucif_IpPH3Gbvs6iyLVMf0jlKgj4EOBtrDHanikeqkWc0W2pWjIIac8cyUrOtZCj7h3 

Was mache ich hier falsch?

Auch .. Wunder .. wo ist der Token gespeichert? Wie kann die Web-API überprüfen, ob das empfangene Token an den betreffenden Benutzer angehängt ist?

Fehle ich eine benutzerdefinierte Implementierung einer Token-Speicherklasse? Wenn ja, wo finde ich Informationen zur Implementierung eines benutzerdefinierten Token-Speichers?

Antwort

0

Das Token wird nicht irgendwo gespeichert, es ist nur ein codiertes Bit von Daten und Sie können die Informationen daraus extrahieren, wenn Sie es auf der anderen Seite erhalten.

Die Validierung erfolgt innerhalb der ValidateClientAuthentication-Methode. Sie haben den Kontext so eingerichtet, dass er ohne Prüfungen überhaupt authentifiziert wird. Hier überprüfen Sie, ob die ClientID/Client Secret-Kombination korrekt ist, der Name zeigt dies ebenfalls an. Sie können dort zusätzliches Material hinzufügen.

Ich persönlich benutze OAuth2 nicht für die Authentifizierung auf Benutzerebene, aber nichts hindert Sie daran, das zu tun, wenn Sie das brauchen. Ich bevorzuge es, die Token-Anwendung in Verbindung zu halten, nicht benutzerbezogen, aber das ist nur meine Vorliebe.

GrantResourceOwnerCredentials setzt einen Kontextfehler auf invalid_grant? Die Gewährung hat nichts mit dem Benutzernamen/Passwort zu tun, das du durchgehen willst. Sie setzen den grant_type nur, wenn Sie das Token anfordern, und normalerweise vom Typ password. invalid_grant bedeutet, dass du einen anderen Grant-Typ ausprobierst, der aus deinem Code nicht klar hervorgeht.

Sie haben auch nicht, uns Ihre Token Formatklasse gezeigt, wie Sie es schaffen, welche Informationen Sie in sie, usw.

auch eine Sache, die ich habe bemerkt, dass Sie beide

verwenden

UseOAuthBearerAuthentication - mit leeren Optionen und UseOAuthAuthorizationServer.

Der letzte sollte genug sein, würde ich denken. Ich habe JWT bei der Verwendung von OAuth2 verwendet, aber es sieht nicht so aus, als würden Sie es tatsächlich verwenden. Der Code sieht ein bisschen überall um ehrlich zu sein.

Ich frage mich, ob es Ihnen etwas ausmachen würde, ein Repo mit gerade genug Code zu erstellen, um das Problem zu replizieren.

Ich werde versuchen, heute Abend einen Blick zu werfen, um zu sehen, ob ich das Problem replizieren kann. Sie können mich später auf Twitter begrüßen.

Verwandte Themen