2016-12-17 2 views
1

Ich habe ein Asp.net Web-API-2-Projekt. In diesem Projekt verwende ich OWIN-Authentifizierung. Ich habe zwei Arten von Benutzern.Verwenden Sie zwei Möglichkeiten, um Bearer-Token für Benutzer in Web-API 2 mit owin Kontext zu erstellen

Eine Art von sind diejenigen, die sich mit Benutzername und Passwort anmeldet, ein anderer Typ sind diejenigen, die sich mit Handynummer und einem vierstelligen Wort anmeldet.

Ich möchte diese beiden Benutzer gehen die Adresse/Token ihre Token zu bekommen, meine Implementierung so weit wie folgt aus:

Dies ist Startklasse:

var provider = new AuthorizationServerProvider(); 
var options = new OAuthAuthorizationServerOptions() 
{ 
    AllowInsecureHttp = true, 
    TokenEndpointPath = new PathString("/token"), 
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 
    Provider = provider 
}; 
public class AuthorizationServerProvider : OAuthAuthorizationServerProvider 
{ 
    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     context.Validated(); 
    } 

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
     using (DbContext dbContext = new DbContext()) 
     { 
      var user = dbContext.User 
       .Where(a => a.UserName == context.UserName) 
       .Where(a => a.Password == context.Password) 
       .Select(a => new UserClaim 
       { 
        Id = a.Id, 
        UserName = a.UserName, 
        FirstName = a.FirstName, 
        LastName = a.LastName, 
        Roles = a.UserInRoles.Select(w => w.Role.Id).ToList() 
       }).FirstOrDefault(); 

      if (user == null) 
      { 
       context.SetError("invalid grant", "Provided username and password is incorrect."); 
       return; 
      } 
      identity.AddUserClaim(user); 
      context.Validated(identity); 
      return; 
     } 
    } 
} 

Diese Lösung für den Anwender ist Wer möchte sich mit dem Benutzernamen anmelden, aber was ist mit den Benutzern, die sich mit der Handynummer anmelden wollen? Was soll ich tun?

+1

Sie sollten mehrere 'OAuthAuthorizationServerProvider' zu Ihrer Pipeline hinzufügen können. Erstelle einfach zwei, einen für Benutzername/Passwort und einen für Handy/Pin. Prüfen Sie bei jedem Anbieter, ob das eine oder das andere verwendet wird. – Michael

Antwort

1

Sie müssen zwei Instanzen von OAuthAuthorizationServerOptions für die Autorisierung mit Benutzername und Passwort und eine für mobileNummer und Code angeben und diese beiden Optionen über Autorisierungs-Middleware zu Ihrer OWIN-Pipeline hinzufügen.

aber Sie sollten in diesem Fall wissen, dass diese beiden Anbieter auf unterschiedliche Anfrage Endpoint antworten.

Wenn Sie einen Endpunkt für beide Arten der Autorisierung benötigen, können Sie Ihre GrantResourceOwnerCredentials Methode in OAuthAuthorizationServerProvider ändern.

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
{ 
    var identity = new ClaimsIdentity(context.Options.AuthenticationType); 

    var form = await context.Request.ReadFormAsync().Result; 
    if (form["type"] == "mobile") 
    { 
     //validate mobileNumber and code 
    } 
    else 
    { 
     //validate username and password 
    } 

    identity.AddUserClaim(user); 
    context.Validated(identity); 
    return; 

} 
Verwandte Themen