2017-02-15 6 views
0

KontextSo passen Sie die Validierung von WebApi-OAuth-Token an?

Ich habe eine Arbeits WebApi2 Anwendung, die die aus der Box Inhaber Token-Validierung verwendet, ebenso wie in der ursprünglichen Visual Studio Projektvorlage war.

Ich möchte eine benutzerdefinierte Daten zum generierten Token hinzufügen, dann überprüfen Sie mit diesen benutzerdefinierten Daten, wenn die folgenden API-Aufrufe passieren, was dieses Token präsentiert.

Beispielhaft möchte ich die IP-Adresse des Anrufers speichern, als das Token erstellt wurde, und dann beim Überprüfen des Tokens prüfen, ob der Anruf, der das Token verwendet, die gleiche IP hat.

fand ich die benutzerdefinierte Klasse

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider 

in meinem Projekt, und ich sehe auch, dass OAuthOptions dass benutzerdefinierte Klasse in Windows Start zu verwenden, konfiguriert ist.

Ich nehme an, wo meine benutzerdefinierten Token-Daten (die ip) hinzuzufügen:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 

hier ich es die Ticket Eigenschaften als benutzerdefinierte Daten hinzufügen kann.

Frage

Allerdings kann ich nicht, in welcher Methode herauszufinden, gegen das Token zu überprüfen, hat diese Daten, und sie paßt auf den IP tatsächlichen Anruf, und wenn nicht, dann betrachtet das Token ungültig?

Antwort

2

Sie haben absolut Recht, als Sie sich entschieden haben, OAuthAuthorizationServerProvider zu implementieren. Nun müssen Sie so etwas wie hinzufügen:

 private ClaimsIdentity CreateIdentity(User user, string authenticationType) 
    { 
     var identity = new ClaimsIdentity(authenticationType); 

     identity.AddClaim(new Claim(ClaimTypes.Name, user.Login)); 
     identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.UserID.ToString())); // or ip instead of user.UserID if you need 
     return identity; 
    } 

Und dann verwenden, in Ihrem Grant... Verfahren (zum Beispiel GrantResourceOwnerCredentials) wie folgt aus:

 ClaimsIdentity identity = CreateIdentity(user, context.Options.AuthenticationType); 
     context.Validated(identity); 

Dann, wenn Anfrage kommt, um Ihre WebAPI Controller können Sie überprüfen, Ihre Daten in Ihrem benutzerdefinierten Attribut:

  Claim userIdClaim = ((ClaimsIdentity)actionContext.ControllerContext.RequestContext.Principal.Identity) 
      .Claims 
      .FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier); 

hoffe, es hilft.

+0

Verbleibend im IP-Beispiel, ist es für mich nicht klar, wo und wann und wie _adainst_ die gespeicherte IP zu überprüfen, und _reject_ die Anfrage als ungültig? –

+0

@ g.pickardou Nachdem der Benutzer die Berechtigung übergeben hat und Sie seine IP in der Anforderung speichern, können Sie ein eigenes Attribut erstellen (erben ActionFilterAttribute), um eingehende Anforderungen zu überprüfen. Dann können Sie in OnActionExecuting schreiben: – grbulat

+0

'var owinContext = (OwinContext) actionContext.Request.Properties [" MS_OwinContext "]; Zeichenfolge ip = owinContext.Request.RemoteIpAddress; Anspruch userIpClaim = ((ClaimsIdentity) actionContext.ControllerContext.RequestContext.Principal.Identity) .Klaims .FirstOrDefault (c => c.Type == ClaimTypes.NameIdentifier); if (userIpClaim == null \t \t && string.CompareOrdinal (userIpClaim.Value, ip)! = 0) { actionContext.Response = actionContext.Request.CreateResponse (Httpstatuscode.Nicht autorisiert); Rückkehr; } ' – grbulat

Verwandte Themen