2017-02-24 1 views
0

Ich versuche stateless Auth für meine API mit Nancy zu implementieren, aber ich habe ein Problem nach der sample stateless project aufgetreten. Wenn ich meine schaffen StatelessAuthenticationConfigurationNancy Stateless Auth Config akzeptiert keine IPrincpal

new StatelessAuthenticationConfiguration(nancyContext => 
    { 
     var apiKey = JsonConvert.DeserializeObject<ApiKeyModel>(nancyContext.Request.Body.AsString()).ApiKey; 
     return GetUserFromApiKey(apiKey); 
    }); 

es gibt mir eine Fehlermeldung über nicht in der Lage zu sein implizit die IPrincipal

internal static IPrincipal GetUserFromApiKey(string apiKey) 
    { 
     using (var con = GetConnection()) 
     { 
      using (var cmd = con.CreateCommand()) 
      { 
       Console.WriteLine($"Key: {apiKey}"); 
       cmd.CommandText = $"SELECT username FROM apiKeys WHERE apiKey = {apiKey}"; 
       string username = (string)cmd.ExecuteScalar(); 

       if (string.IsNullOrWhiteSpace(username)) 
        return null; 
       else 
        return new ClaimsPrincipal(new GenericIdentity(username, "stateless"));//new UserModel(username); 
      } 
     } 
    } 

Ich gebe es zu werfen. Ich habe versucht, zu IUserIdentity Casting und auch meine eigenen UserModel

class UserModel : IUserIdentity 
{ 
    public string UserName { get; } 

    public IEnumerable<string> Claims { get; } 

    public UserModel(string username) 
    { 
     UserName = Uri.EscapeDataString(username); 
    } 


} 

Umsetzung IUserIdentity verwenden. Dies ergibt keinen Fehler, aber der Benutzer wird nicht authentifiziert. Der Benutzer kann immer noch nicht meinen Zugang secure module

public class APIModule : NancyModule 
{ 
    public APIModule() : base("/api") 
    { 
     StatelessAuthentication.Enable(this, Aoba.StatelessConfig); 
     this.RequiresAuthentication(); 

     Post["/"] = _ => 
     { 
      Console.WriteLine(Context.CurrentUser.IsAuthenticated()); 
      return new Response { StatusCode = HttpStatusCode.OK }; 
     }; 
    } 
} 

obwohl es vorbei an all der erforderlichen Validierung zu machen und eine korrekte apikey hat. Nach meinen Tests scheint es, dass der Benutzer niemals dem Nancy-Kontext zugewiesen wird. Die Konfiguration wird verwendet und der Benutzer wird über den apiKey erhalten, aber er wird nie eingestellt. Gibt es etwas, das mir fehlt? Vollständiges Projekt kann here gefunden werden, wenn Sie das Projekt weiter untersuchen möchten.

+0

Zeigen Sie uns Ihren Code. –

+0

@MAdeelKhalid Der Code wurde verlinkt, aber ich habe ihn jetzt auch inline hinzugefügt. – TheDarkVoid

Antwort

0

Es stellte sich heraus, der Fehler war mit meiner Abfrage, um den Benutzer von einem apiKey zu erhalten. Unten ist die Korrektur, jetzt funktioniert alles wie erwartet.

internal static UserModel GetUserFromApiKey(string apiKey) 
    { 
     using (var con = GetConnection()) 
     { 
      using (var cmd = con.CreateCommand()) 
      { 
       Console.WriteLine($"Key: {apiKey}"); 
       cmd.CommandText = $"SELECT username FROM apiKeys WHERE apikey = '{apiKey}'"; 
       using (var reader = cmd.ExecuteReader()) 
       { 
        if (!reader.HasRows) 
         return null; 
        reader.Read(); 
        string username = reader.GetString(0); 
        if (string.IsNullOrWhiteSpace(username)) 
         return null; 
        else 
         return new UserModel(username); 
       } 
      } 
     } 
    } 
Verwandte Themen