Wie erhalte ich Zugang zu Microsoft.Owin.Sicherheit.xyz OnAuthenticated Kontext AddClaims Werte?
Ich versuche, das abrufen von Benutzer-Eigenschaften zurückgegeben werden, wie die OnAuthenticated Kontext und fügte hinzu, als Ansprüche nach diesem Beispiel: Wie der Zugriff auf Facebook private Informationen mit ASP.NET Identität (OWIN)?
Kann ich sehen, dass Daten, die ich erwarte wird zurückgegeben bei der Anmeldung und wird nun als Forderung im Startup.Auth.cs. Aber, wenn ich in den Konto-Controller, der nur behauptet, erscheint im UserManager oder UserStore ist, ausgestellt von der LOKALEN BEHÖRDE. Keine Ansprüche können gefunden werden bei Facebook (oder anderen externen Anbietern). Wo kommen die Forderungen Hinzugefügt Kontext am Ende? (Ich verwende VS2013 RTM.)
Vollständige Quelle und die live-Website auf Azure hier verlinkt: https://github.com/johndpalm/IdentityUserPropertiesSample/tree/VS2013rtm
Hier ist, was ich im Systemstart.Auth.cs:
var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions()
{
AppId = ConfigurationManager.AppSettings.Get("FacebookAppId"),
AppSecret = ConfigurationManager.AppSettings.Get("FacebookAppSecret"),
Provider = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
const string XmlSchemaString = "http://www.w3.org/2001/XMLSchema#string";
foreach (var x in context.User)
{
var claimType = string.Format("urn:facebook:{0}", x.Key);
string claimValue = x.Value.ToString();
if (!context.Identity.HasClaim(claimType, claimValue))
context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, XmlSchemaString, "Facebook"));
}
context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, XmlSchemaString, "Facebook"));
return Task.FromResult(0);
}
}
};
facebookOptions.Scope.Add("email");
app.UseFacebookAuthentication(facebookOptions);
Eine alternative Methode zur Erfassung der externen login-Eigenschaften wäre, einen einzigen Anspruch für den access-token und füllen es mit Eigenschaften:
const string XmlSchemaString = "http://www.w3.org/2001/XMLSchema#string";
var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions
{
AppId = ConfigurationManager.AppSettings.Get("FacebookAppId"),
AppSecret = ConfigurationManager.AppSettings.Get("FacebookAppSecret"),
Provider = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
var claim = new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, XmlSchemaString, "Facebook");
foreach (var x in context.User)
{
string key = string.Format("urn:facebook:{0}", x.Key);
string value = x.Value.ToString();
claim.Properties.Add(key, value);
}
context.Identity.AddClaim(claim);
return Task.FromResult(0);
}
}
};
HINWEIS - Dieses Beispiel funktioniert nicht: Obwohl es schön wäre, um einen einzigen Anspruch mit Eigenschaften. Die externe cookie scheint zu beachten, zu Ehren der Ansprüche Eigenschaften. Die Eigenschaften sind leer, wenn das abrufen von Ihnen später von der Identität.
InformationsquelleAutor der Frage John Palmer | 2013-10-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
War ich in der Lage zu schaffen, ein lauffähiges Beispiel, mit MVC 5 RTM-Vorlagen, OWIN, und ASP.NET Identität bits. Finden Sie die vollständige Quelle und einen link zu einem live-Beispiel hier: https://github.com/johndpalm/IdentityUserPropertiesSample
Hier ist was für mich gearbeitet:
Erstellen Sie eine neue (fügen Sie den Namen des Anbieters hier) AuthenticationOptions Objekt in Startup.ConfigureAuth (StartupAuth.cs), übergeben Sie die client id, client secret und eine neue AuthenticationProvider. Verwenden Sie einen lambda-Ausdruck übergeben werden, die OnAuthenticated Methode etwas code hinzufügen, um Ansprüche auf die Identität, die die Werte enthalten, die Sie extrahieren aus dem Kontext.Identität.
Start.Auth.cs
HINWEIS: Die Facebook auth-provider funktioniert mit dem code, der hier verwendet wird. Wenn Sie mit dieser gleichen code mit der Microsoft-Konto-provider (oder Foursquare-Anbieter habe ich mit dem MS-Konto-code als ein Modell), es nicht login. Wenn Sie wählen Sie einfach die parameter access_token, es funktioniert gut. Scheint so, dass einige Parameter brechen Sie den login-Prozess. (Ein Problem wurde eröffnet katanaproject.codeplex.com wenn der Fortschritt auf dieser ist für Sie von Interesse.) Ich werde aktualisieren, wenn ich die Ursache finden. Ich habe nicht viel mit Twitter oder Google darüber hinaus zu überprüfen, dass ich bekommen konnte die access_token.
Im AccountController, ich nutze die "ClaimsIdentity" - von der AuthenticationManager die Verwendung der externen cookie. Ich habe dann hinzufügen, um die Identität mit dem application-cookie. Ich ignorierte alle Ansprüche, die beginnt mit "...schemas.xmlsoap.org/ws/2005/05/identity/claims" da schien es zu brechen, die Anmeldung.
AccountController.cs
Und schließlich möchte ich zeigen, was Werte sind nicht von der LOKALEN BEHÖRDE. Ich erstellte eine Teilansicht _ExternalUserPropertiesListPartial , erscheint auf dem /Account/Manage-Seite. Ich bekomme die Ansprüche, die ich vorher gespeichert von AuthenticationManager.Benutzer.Ansprüche und dann übergeben es an die view.
AccountController.cs
Und nur um gründlich zu sein, die Ansicht:
_ExternalUserPropertiesListPartial.cshtml
Wieder, die Arbeit Beispiel und vollständige code ist auf GitHub: https://github.com/johndpalm/IdentityUserPropertiesSample
Und jedes feedback, Korrekturen oder Verbesserungen wäre zu begrüßen.
InformationsquelleAutor der Antwort John Palmer
So, in diesem Artikel wird erklärt, wie das ganze funktioniert ziemlich gut: Entkopplung owin externe auth
Aber die kurze Antwort ist, wenn Sie authentifiziert von facebook, dass Ihnen eine externe Identität. Sie müssen dann nehmen, dass die externe Identität und 'anmelden', eine lokale app-Identität, seine in diesem stepthat müssen Sie alle Ansprüche, die Sie wollen aus der externen Identität "ClaimsIdentity" - das wird User.Identität.
Edit: Zur Klärung des weiteren konnten Sie es innerhalb von ExternalLoginCallback:
So müssen Sie die pass-zusätzliche Daten in der SignIn, die wie folgt Aussehen:
Diese "ClaimsIdentity" haben Ihren zusätzlichen Forderung, und Sie müssen hinzufügen, dass die Behauptung der Identität erstellt, in der SignInAsync Methode für Sie angezeigt.
InformationsquelleAutor der Antwort Hao Kung
Kurz die Linie, die erforderlich ist, sobald AddClaim verwendet wird, ist wie folgt:
Genommen von der johns Antwort oben.
InformationsquelleAutor der Antwort Piotr Stulinski