2016-10-06 1 views
1

Ich möchte herausfinden, welcher Codeabschnitt welchen Wert für den Schlüssel "security.Authenticate" im Owin Kontext setzen.Wie finden Sie heraus, wo ein bestimmtes Schlüsselwertpaar in Microsoft Katana in den Owin-Kontext eingefügt wurde?

Wie mache ich das?

Ich benutze Microsoft Katana mit AspNet Identity.

Hintergrund

ich die OAuth 2.0-Spezifikation gelesen habe, aber mein Ziel ist es, herauszufinden, wie Microsoft es in ihrem Code implementiert.

Wenn Sie also eine ASP.NET MVC-Projektvorlage mit Individuelle Konten Authentifizierung in Visual Studio 2015 öffnen, erhalten Sie eine Menge Kesselblechcode.

Im Laufe der Jahre habe ich gelernt, das meiste davon zu verstehen, aber hin und wieder vergesse ich und fange an, Dinge mit Reflector und IL Spy zu verfolgen.

Gerade jetzt, ich versuche zu verstehen, wie die ChallengeResult Klasse, die mit der Boilerplate kommt an den OAuth-Anbieter umleiten, wenn es überhaupt nicht scheinbar aussieht auf seine ExecuteResult Methode, die es tut.

Meine Recherche führte mich zu einer Codezeile, die eine func aus der OwinContext bekommt und ausführt. Der Schlüssel, den func mit in der OwinContext gespeichert wurde, war "security.Authenticate".

// Microsoft.Owin.Security.AuthenticationManager 
internal Func<string[], 
     Action<IIdentity, 
     IDictionary<string, string>, 
     IDictionary<string, object>, object>, 
     object, 
     Task> AuthenticateDelegate 
{ 
    get 
    { 
     return this._context 
     .Get<Func<string[], 
     Action<IIdentity, IDictionary<string, string>, IDictionary<string, object>, object>, 
     object, Task>>("security.Authenticate"); 
    } 
} 
+0

Gute Frage und das habe ich auch nicht so schnell gefunden. Kann ich fragen, was Sie dazu gebracht hat, diesen bestimmten Gegenstand zu untersuchen? – trailmax

+0

@trailmax Nur Neugier. Ich mag es, Abstraktionen auseinander zu reißen und nach innen zu schauen. Ich schreibe normalerweise immer meinen eigenen OAuth-Code, weil es so einfach ist. Aber bei Projekten in der Vergangenheit habe ich Microsofts Code benutzt und jedes Mal werde ich es bis zu dem Punkt verfolgen, wo ich weiß, was vor sich geht. Die Sache ist: Das nächste Mal werde ich die meisten Bits vergessen haben. Ich mache es wieder, weil ich mich mit Facebook integrieren möchte. Integration ist nicht die Herausforderung. In der Tat ist es ein Stück Kuchen. Nur dass ich schwarze Kisten hasse, wenn ich nicht weiß, was drinnen passiert. –

+0

Das ist ein großer Wunsch! Lass mich sehen, ob ich es finden kann ... – trailmax

Antwort

1

Dieser Wert wird in OwinRequestExtensions gesetzt, die in AuthenticationHandler verwendet wird. Und nach der langen Kette von Anrufen landet es in CookieAuthenticationMiddleware und anderen Authentifizierungs-Middlewares.

+0

Vielen Dank. Ich war nahe. Ich habe 'var func = context.HttpContext.GetOwinContext(). Get , IDictionary , Objekt>, Objekt, Aufgabe >> (" security.Authenticate "); Debug.Print (func.GetType(). ToString()); Debug.Print (func.Target.ToString()); 'innerhalb des' ChallengeResult.Execute'. –

+0

Ich habe eine verwandte Frage über Bereiche in OAuth, aber ich denke, ich werde eine neue Frage dazu stellen. Die Zusammenfassung dieser Frage lautet: Ich stelle fest, dass der neue Standardcode, der mit VS 2015 und Facebook-Authentifizierung geliefert wird, nicht die E-Mail-Adresse des Benutzers erhält. Ruft nur den vollständigen Namen des Benutzers ab. Außerdem fragt es den Benutzer nicht nach dem Bestätigungsdialog "Diese App möchte das und das andere über Sie wissen. Zustimmen?"Wo kann ich Katana zwingen, Bereiche hinzuzufügen, um die E-Mail-Adresse des Benutzers zu erhalten und auch den Anmeldebestätigungsdialog auf Facebook anzuzeigen? –

+0

ja, das Problem war, dass dieser Wert in mehr als einer Konstante definiert wurde. Und Sie mussten die Verwendung von beiden verfolgen." Konstanten. – trailmax

Verwandte Themen