2014-01-20 15 views
32

Ich habe ein API-spezifisches Projekt in einer großen .net MVC 5-Weblösung. Ich verwende die WebApi2-Vorlagen standardmäßig, um einen Benutzer über die API zu authentifizieren. Bei der Verwendung einzelner Konten zur Authentifizierung ist der erforderliche Anforderungskörper zum Abrufen eines Zugriffstokens wie folgt:Wie verbrauchen Sie zusätzliche Parameter in der OAuth2-Token-Anforderung in der .net WebApi2-Anwendung

grant_type=password&username={someuser}&password={somepassword} 

Dies funktioniert wie erwartet.

Ich muss jedoch eine dritte Dimension der Gerüstmethode "GrantResourceOwnerCredentials" hinzufügen. Zusätzlich zum Überprüfen des Benutzernamens/Passworts muss ich eine Geräte-ID hinzufügen, die den Zugriff von einem Benutzerkonto auf ein bestimmtes Gerät beschränken soll. Was nicht klar ist, ist, wie diese zusätzlichen Anforderungsparameter zu dem bereits definierten "OAuthGrantResourceOwnerCredentialsContext" hinzugefügt werden. Dieser Kontext macht derzeit Platz für UserName und Passwort, aber natürlich muss ich mehr hinzufügen.

Meine Frage ist einfach, gibt es eine Standardmethode, um die Login-Anforderungen für die OWIN OAuth2-Token-Anfrage zu erweitern, um mehr Daten aufzunehmen? Und wie würden Sie das in einer .NET WebApi2-Umgebung zuverlässig tun?

Antwort

86

Wie es oft der Fall ist, ich die Antwort unmittelbar nach dem Absenden der Frage gefunden ...

ApplicationOAuthProvider.cs enthält den folgenden Code out-of-the-box

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
{ 
    using (UserManager<IdentityUser> userManager = _userManagerFactory()) 
    { 
     IdentityUser user = await userManager.FindAsync(context.UserName, context.Password); 

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

     ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user, 
      context.Options.AuthenticationType); 
     ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user, 
      CookieAuthenticationDefaults.AuthenticationType); 
     AuthenticationProperties properties = CreateProperties(context.UserName, data["udid"]); 
     AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties); 
     context.Validated(ticket); 
     context.Request.Context.Authentication.SignIn(cookiesIdentity); 
    } 
} 

Durch einfache Hinzufügen

Innerhalb der Methode können Sie auf alle veröffentlichten Variablen im Anfragetext zugreifen und sie verwenden, wie Sie möchten. In meinem Fall habe ich es sofort nach der Null-Überprüfung auf den Benutzer gelegt, um eine restriktivere Sicherheitsüberprüfung durchzuführen.

Hoffe das hilft jemandem!

+1

'var data = erwarten context.Request.ReadFormAsync();' hat mir wirklich geholfen. – Zapnologica