2014-06-25 6 views
7

Ich sichere eine Web-API-Site und möchte Tokens verwenden. Aber ich arbeite mit einer Legacy-Datenbank, wo es eine Benutzertabelle gibt und jeder Benutzer hat bereits ein Token für sie erstellt und in der Tabelle gespeichert.API-Träger-Tokens - kann ich benutzerdefinierte Tokens verwenden?

Ich versuche zu arbeiten, wenn ich die Identität oAuth Inhaber Token Auth Bits verwenden können, aber alles in meiner vorhandenen Datenbank stecken, so dass

  1. ein Token Gewähren nur das Token für den Benutzer zurückgibt aus dem db
  2. ich das Token, indem man es bis in den db und die Schaffung eine Identität von dem Benutzer überprüfen kann (ich bin mit ASP.NET Identität an anderer Stelle in der Website für die MVC-Seite der Dinge)

Ich kann nicht herausfinden, ob das möglich ist, oder ob ich etwas geben sollte und verwenden Sie einen Standard-HTTP-Handler-Ansatz. Hier ist mein ziemlich standardmäßiger Code, der nur Standard-Token ausgibt, nicht die existierenden, mit denen ich arbeiten möchte.

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

// Token Generation 
app.UseOAuthAuthorizationServer(OAuthServerOptions); 

var bearerAuth = new OAuthBearerAuthenticationOptions() 
{ 
    Provider = new OAuthBearerAuthenticationProvider() 
}; 

app.UseOAuthBearerAuthentication(bearerAuth); 


public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider 
{ 


    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     context.Validated(); 
    } 

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 

     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); 

     var manager = new UserManager<User, long>(new UserStore(new UserRepository())); 
     var user = await manager.FindAsync(context.UserName, context.Password); 

     if (user == null) 
     { 
      context.SetError("invalid_grant", "The user name or password is incorrect."); 
     } 
     else 
     { 
      var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
      identity.AddClaim(new Claim("name",user.Email)); 
      context.Validated(identity); 
     } 


    } 
} 

Antwort