public static SessionSecurityToken GetSessionSecurityToken(
            this WSFederationAuthenticationModule fam,
            HttpContext context,
            out string identityProvider,
            out string userName,
            out string email,
            out string displayName,
            string emailClaimType            = DefaultEmailClaimType,
            string displayNameClaimType      = DefaultDisplayNameClaimType,
            string identityProviderClaimType = DefaultIdentityProviderClaimType)
        {
            var principal            = fam.GetClaimsPrincipal(context);
            var sessionSecurityToken = new SessionSecurityToken(principal);

            userName = principal.Identity.Name;

            Func <string, string> find = claimType => !string.IsNullOrWhiteSpace(claimType)
                                ? principal.Identities
                                         .SelectMany(identity => identity.Claims)
                                         .Where(claim => string.Equals(claim.ClaimType, claimType, StringComparison.OrdinalIgnoreCase))
                                         .Select(claim => claim.Value)
                                         .FirstOrDefault()
                                : null;

            identityProvider = find(identityProviderClaimType);
            email            = find(emailClaimType);
            displayName      = find(displayNameClaimType);

            return(sessionSecurityToken);
        }