Ich habe zwei Websites https://www.somesite.com (Benutzerwebsite) und https://admin.anothersite.com (Admin-Website) und ich benutze Identity Server 3 für die Zugriffskontrolle, die auf https://identity.somesite.com gehostet wird.Identität Server und Benutzer Identitätswechsel
Die Websites werden im Identity Server als derselbe Client (verschiedene Weiterleitungs-URLs) mit Cookie-basierter Authentifizierung konfiguriert. Ich möchte einen Mechanismus bereitstellen, bei dem Benutzer der Verwaltungssite Benutzer der Benutzersite annehmen können.
Ich habe gesehen, dass ich Cookies mit der IssueLoginCookie
, aber dieser Anruf muss auf dem Identitätsserver, so dass es auf einer anderen Domäne, ich kann nicht sehen, wie das funktionieren würde.
Wie kann ich den Identitätsserver für Identitätsserver unterstützen?
aktualisiert
Ich habe jetzt die Admin-Seite eine URL generieren, wie so:
var url = 'http://localhost:61826/connect/authorize'
+ '?state=' + encodeURIComponent(((Date.now() + Math.random()) * Math.random()).toString().replace(".", ""))
+ '&nonce=' + encodeURIComponent(((Date.now() + Math.random()) * Math.random()).toString().replace(".", ""))
+ '&client_id=mvc'
+ '&redirect_uri=' + encodeURIComponent('http://localhost:64822/')
+ '&scope=' + encodeURIComponent('openid profile roles api1')
+ '&acr_values=' + encodeURIComponent('loginas:3230')
+ '&response_type=' + encodeURIComponent('id_token token')
+ '&prompt=login';
window.location.href = url;
Dies ermöglicht es mir, das Login-Ereignis zur Abholung in der PreAuthenticateAsync
Methode auf meinem benutzerdefinierten IUserService
und die Login-abfangen . Meine aktuelle Implementierung ist:
public override async Task PreAuthenticateAsync(PreAuthenticationContext context)
{
if (context.SignInMessage.AcrValues.Any(acr => acr.StartsWith("loginas:")))
{
// Would need to also ensure that the user has the relevant persmissions to impersonate another user
var subjectId = _owinContext.Authentication.User.GetSubjectId();
var login = new AuthenticatedLogin
{
Name = "Impersonating For Fun",
Subject = "3230",
Claims = new List<Claim>
{
new Claim(Constants.ClaimTypes.Subject, "3230")
},
PersistentLogin = true,
IdentityProvider = Constants.BuiltInIdentityProvider,
AuthenticationMethod = "Cookies"
};
_owinContext.Environment.IssueLoginCookie(login);
var impersonationClaims = new List<Claim>
{
new Claim("AdminUserId", subjectId)
};
context.AuthenticateResult = new AuthenticateResult("3230", "Impersonating For Fun", impersonationClaims);
}
await Task.FromResult(0);
}
Der Benutzer wird nicht die Anmeldeseite angezeigt und wird korrekt an die Ziel-URL weitergeleitet. Der Benutzer hat jedoch nicht zu dem neuen Benutzer gewechselt, sondern verbleibt als der ursprüngliche Benutzer. Was vermisse ich?