public SecurityContextOld(ClaimsIdentity impersonatedClaimsIdentity, List <string> roles, SecurityContextOld impersonationContext) : this(impersonatedClaimsIdentity, roles) { Require.NotNull(impersonationContext, "impersonationContext"); _impersonationSecurityContext = impersonationContext; }
/// <summary> /// Aktiviert die Simulation der Nutzung der Anwendung im Kontext eines anderen Nutzers. /// </summary> /// <param name="user"></param> public void EnableImpersonation(User user) { Require.NotNull(user, "user"); if (!CanImpersonateUser(user)) { LogManager.GetLogger <SecurityContextOld>().ErrorFormat("Unerlaubter Impersonifizierungs-Versuch: Nutzer {0} wollte {1} simulieren", _currentClaimsIdentity.Name, user); throw new SecurityException("Der Nutzer darf nicht impersonifiziert werden."); } LogManager.GetLogger <SecurityContextOld>().InfoFormat("Impersonifizierung aktiviert: Nutzer {0} simuliert {1}", _currentClaimsIdentity.Name, user); /*TODO: Das gibt es an anderer Stelle schon mal. Sollte nur einmal existieren.*/ SecurityUser impersonatedSecurityUser = new SecurityUser(user.BusinessId.ToString(), user.UserName, user.Email, user.PasswordHash, user.IsEnabled, user.Roles.ToList(), user.FirstName, user.LastName); /*zu simulierende ClaimsIdentity erstellen*/ ClaimsIdentity impersonatedClaimsIdentity = new ClaimsIdentity(); /*Rollen als Claims hinzufügen*/ foreach (string role in _roles) { impersonatedClaimsIdentity.AddClaim(new Claim(ClaimTypes.Role, role)); } impersonatedClaimsIdentity.AddClaim(new Claim(ClaimTypes.Name, impersonatedSecurityUser.UserName)); impersonatedClaimsIdentity.AddClaim(new Claim(ClaimTypes.Email, impersonatedSecurityUser.Email)); impersonatedClaimsIdentity.AddClaim(new Claim(ClaimTypes.PrimarySid, impersonatedSecurityUser.Id)); impersonatedClaimsIdentity.AddClaim(new Claim(ClaimTypes.NameIdentifier, impersonatedSecurityUser.Id)); /* Impersonifizierten Context mit Backup auf diesen Context erstellen*/ SecurityContextOld impersonationContext = new SecurityContextOld(impersonatedClaimsIdentity, impersonatedSecurityUser.Roles.ToList(), this); /* Impersonifizierten Context aktivieren */ AttachToSession(impersonationContext); }
/// <summary>Authenticates the request.</summary> /// <param name="filterContext">The context to use for authentication.</param> public void OnAuthentication(AuthenticationContext filterContext) { if (!filterContext.Principal.Identity.IsAuthenticated) { /*Kein angemeldeter Nutzer*/ /*SecurityContext aus der Session entfernen.*/ SecurityContextOld.DetachFromSession(); /*SecurityContext aus dem HttpContext entfernen.*/ filterContext.HttpContext.Items["SecurityContext"] = null; return; } /* Zunächst prüfen, ob der SecurityContext bereits hinterlegt ist. * dann muss der SecurityContext nicht erneut erzeugt werden. */ if (SecurityContextOld.IsAttachedToSession()) { return; } AuthorizationManager authorizationManager = new AuthorizationManager(); //IUserService userService = ContextRegistry.GetContext().GetObject<IUserService>(); //User user = userService.GetByBusinessId(Guid.Parse(filterContext.Principal.Identity.GetUserId())); ClaimsIdentity currentClaimsIdentity = filterContext.Principal.Identity as ClaimsIdentity; if (currentClaimsIdentity == null || currentClaimsIdentity.IsAuthenticated == false) { /*Kein angemeldeter Nutzer*/ /*SecurityContext aus der Session entfernen.*/ SecurityContextOld.DetachFromSession(); /*SecurityContext aus dem HttpContext entfernen.*/ filterContext.HttpContext.Items["SecurityContext"] = null; return; } List <Claim> claimRoles = currentClaimsIdentity.Claims.Where(c => c.Type == ClaimTypes.Role).ToList(); List <string> roles = claimRoles.Select(claimsRole => claimsRole.Value.ToString()).ToList(); /*Security Context erzeugen*/ SecurityContextOld securityContext = new SecurityContextOld(currentClaimsIdentity, roles); /*SecurityContext an der Session hinterlegen.*/ SecurityContextOld.AttachToSession(securityContext); /*Zusätzlich den SecurityContext am HttpContext hinterlegen.*/ filterContext.HttpContext.Items["SecurityContext"] = securityContext; }
/// <summary> /// Hinterlegt den SessionContext an der aktuellen Session. /// </summary> /// <param name="securityContext"></param> public static void AttachToSession(SecurityContextOld securityContext) { HttpContext.Current.Session["SecurityContext"] = securityContext; }