Ich wurde mit der Integration von IDS3 in eine vorhandene veraltete MVC-Anwendung beauftragt, die ich nach OWIN migriert habe, die CookieAuthentication verwendet. Über das tolle Beispielprojekt habe ich ein einfaches Setup erhalten, das mit einem benutzerdefinierten Benutzerservice, einer benutzerdefinierten Anmeldeseite und einem Code-Flow-Test-Client funktioniert.Verwendung eines vorhandenen Identitätsstatus der Cookieauthentifizierung auf einer benutzerdefinierten Anmeldeseite
Ich versuche nun, diese Anforderung zu lösen: Wenn ein Benutzer bereits über die bestehende Cookie-Authentifizierung eingeloggt ist und einen Code-Flow über unseren Test-Client einleitet, loggt er sich automatisch in IDS3 ein, damit er nicht aufgefordert wird, diesen einzugeben Anmeldeinformationen erneut. Hier ist die nicht-funktionierenden Code mein Denkprozess zu zeigen:
[Route("identity/logintest", Name = "ids3-login")]
public ActionResult IdsLogin(string id)
{
var ctx = Request.GetOwinContext();
var user = ctx.Authentication.User;
// If they're already logged in via cookie auth, automatically
// log them in to IDS3 and send them on their way
if (user.Identity.IsAuthenticated)
{
var env = ctx.Environment;
env.IssueLoginCookie(new IdentityServer3.Core.Models.AuthenticatedLogin
{
Subject = User.Identity.Name,
Name = User.Identity.Name,
});
var msg = env.GetSignInMessage(id);
var returnUrl = msg.ReturnUrl;
env.RemovePartialLoginCookie();
return Redirect(returnUrl);
}
// Otherwise show the login form as usual
return View();
}
Wenn ich als Benutzer über Cookies Auth melden Sie sich an, der Wert von user.Identity nicht mit diesen Informationen bestückt und daher ist IsAuthenticated falsch. Ich glaube, ich habe ein Pseudoverständnis, warum das momentan fehlschlägt: Ich frage nach dem Authentifizierungswert des mit IDS3 verknüpften Kontextes, nicht nach dem meiner MVC-Anwendung, die die Cookie-Authentifizierung hat, nach der ich suche. (Was konzeptionell verwirrend ist, da dieser Controller Teil meiner MVC-Anwendung ist.)
Dies ist wahrscheinlich weniger eine IDS3-Frage und eher eine OWIN-Frage, aber meine Hoffnung ist, dass jemand anderes versucht hat, diesen Hacky zu implementieren Annäherung vor und kann mich in die richtige Richtung weisen. Hoffentlich, wenn ich alle OWIN-Samples durchsuche, die ich auf http://www.asp.net/aspnet/samples/owin-katana gefunden habe, werden die Dinge mehr Sinn machen, aber im Moment stecke ich fest.
Startup.cs Referenz (nicht enthalten den benutzerdefinierten Service-Code, wie es aus dem CustomLoginPage Beispielprojekt im Grunde kopieren Paste ist):
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var container = AutofacConfig.Configure();
app.UseAutofacMiddleware(container);
app.UseAutofacMvc();
ConfigureAuthentication(app);
ConfigureIdentityServer(app);
}
private static void ConfigureAuthentication(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
LoginPath = new PathString("/login")
});
}
private static void ConfigureIdentityServer(IAppBuilder app)
{
var factory = new IdentityServerServiceFactory()
.UseInMemoryClients(Clients.Get())
.UseInMemoryScopes(StandardScopes.All);
factory.UserService = new Registration<IUserService>(resolver =>
resolver.ResolveFromAutofacOwinLifetimeScope<IUserService>());
var options = new IdentityServerOptions
{
SiteName = "test",
SigningCertificate = LoadCertificate(),
Factory = factory,
AuthenticationOptions = new AuthenticationOptions
{
EnableLocalLogin = true,
}
}
app.Map("/identity", idsrvApp =>
{
idsrvApp.UseIdentityServer(options);
});
}
}
Der Versuch, PreAuthenticate zu implementieren, war tatsächlich mein erster Versuch, aber ich konnte das Ermitteln des benutzerdefinierten Cookie-Bits nicht herausfinden. Mein erster Versuch war, den Benutzer zu identifizieren, indem ich eine IOwinEnvironment injizierte, den OwinContext daraus erstellte und dann den Status von Authentication.User.Identity.IsAuthenticated prüfte, der immer falsch war, selbst wenn ich bei der benutzerdefinierten Cookie-Authentifizierung angemeldet war. Versuch Nr. 2 war, zu versuchen, mein Authentifizierungs-Cookie von Anforderung zu ziehen, es zu entschlüsseln und dann Auth von dort zu überprüfen. Schlägst du das vor, indem du den benutzerdefinierten Cookie feststellst, oder gibt es eine andere Option, die mir fehlt? – timbermeshivers
Nun, Sie sagten, es ist in einem benutzerdefinierten Cookie - wenn Sie den owin Kontext haben, dann sollten Sie in der Lage sein, zum Cookie zu gelangen. Der Zugriff auf User.IsAuthenticated ist möglicherweise nicht das Richtige - aber Sie sollten AuthenticateAsync aufrufen können, damit der Katana-Code das Cookie überprüft. –
Erfolg! Danke für die Hilfe. Ich konnte den Cookie und die Anspruchsidentität darin abrufen. Ich habe anscheinend einige veraltete Techniken benutzt, um den Cookie zu entschlüsseln, aber ein paar Tage, in denen ich ihn nicht anstarrte, ließen ihn herausspringen, als ich den Code erneut besuchte. – timbermeshivers