using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Data; using System.Linq; using System.Web; using Kreta.BusinessLogic.Classes; using Kreta.BusinessLogic.Helpers; using Kreta.Core.ConnectionType; using Kreta.Core.Logic; using Kreta.DataAccessManual; using Kreta.DataAccessManual.Interfaces; using Kreta.DataAccessManual.Util; using Kreta.Enums; using Kreta.Framework; using Kreta.Framework.Security; using Newtonsoft.Json; namespace Kreta.BusinessLogic.Security { public class AuthenticationHelper : LogicBase { public AuthenticationHelper(IConnectionType connectionType) : base(connectionType) { } private const string TokenParameterName = "token"; public AuthenticationInfo GetAuthenticationInfo(LoginInfo loginInfo, string intezmenyiDictionaryEnvironmentName) { return Dal.CustomConnection.Run(ConnectionType, dalHandler => { return GetAuthenticationInfo(dalHandler, loginInfo, intezmenyiDictionaryEnvironmentName); }); } private AuthenticationInfo GetAuthenticationInfo(IDalHandler dalHandler, LoginInfo loginInfo, string intezmenyiDictionaryEnvironmentName) { List szerepkorok = GetSzerepkorok(dalHandler, loginInfo, intezmenyiDictionaryEnvironmentName); return new AuthenticationInfo { InstituteCode = loginInfo.IntezmenyAzonosito.Replace("-eugyintezes", string.Empty), InstituteUserId = loginInfo.FelhasznaloId, InstituteUserUniqueId = loginInfo.FelhasznaloEgyediAzonosito, InstituteUserIdpUniqueId = loginInfo.FelhasznaloIdpEgyediAzonosito, TutelaryIdpUniqueId = loginInfo.GondviseloIdpEgyediAzonosito, TutelaryId = loginInfo.GondviseloId, TutelaryUniqueId = loginInfo.GondviseloEgyediAzonosito, SchoolYearId = loginInfo.AktivTanevId, SchoolYearUniqueId = loginInfo.AktivTanevEgyediAzonosito.HasValue ? loginInfo.AktivTanevEgyediAzonosito.ToString() : null, UserName = loginInfo.BelepesiNev, Name = loginInfo.GondviseloId.HasValue ? loginInfo.GondviseloNeve : loginInfo.NyomtatasiNev, Roles = NormalizeRoles(szerepkorok).ToArray(), EmailAddress = loginInfo.ElsodlegesEmailCim }; } public string CreateUrl(string baseUrl, string key, string intezmenyiDictionaryEnvironmentName) { return Dal.CustomConnection.Run(ConnectionType, dalHandler => { AuthenticationInfo authenticationInfo = GetAuthenticationInfo(dalHandler, UserContext.Instance.LoginInfo, intezmenyiDictionaryEnvironmentName); return CreateUrl(baseUrl, authenticationInfo, key); }); } private List GetSzerepkorok(IDalHandler dalHandler, LoginInfo loginInfo, string intezmenyiDictionaryEnvironmentName) { List szerepkorok = new List(); var helper = new FelhasznaloHelper(new DalHandlerConnectionType(ConnectionType, dalHandler)); Dictionary felhasznaloiSzerepkorok = helper.GetFelhasznaloiSzerepkorok(intezmenyiDictionaryEnvironmentName); foreach (SzerepkorTipusEnum szerepkorTipus in felhasznaloiSzerepkorok.Keys) { szerepkorok.AddRange(helper.GetFelhasznaloiJogosultsagok(FelhasznaloId, (int)szerepkorTipus)); } if (loginInfo.GondviseloId.HasValue) { var isCsokkentettGondviselo = dalHandler.Felhasznalo().IsCsokkentettGondviselo(loginInfo.GondviseloId.Value, IntezmenyId, TanevId); if (isCsokkentettGondviselo) { // ha csökkentett gondviselő, akkor nem lehet semmilyen más joga! szerepkorok = new List { KretaClaimPackages.CsokkentettGondviselo.ClaimValue }; } else { szerepkorok.Add(KretaClaimPackages.Gondviselo.ClaimValue); DataSet SZMKOsztalyok = dalHandler.EugyintezesDal().GetSZMKOsztalyok(loginInfo.GondviseloId.Value); if (SZMKOsztalyok.Tables[0].Rows.Count != 0) { szerepkorok.Add(KretaClaimPackages.SZMKKepviselo.ClaimValue); } } } else { var ds = dalHandler.Alkalmazott().GetInfoForLoginAlkalmazott(loginInfo.FelhasznaloId, loginInfo.SelectedTanevId); if (ds.Tables[0].Rows.Count > 0) { szerepkorok.Add(KretaClaimPackages.Alkalmazott.ClaimValue); var fokuszEnabled = new List { (int)VezetoiOraszamokTipusEnum.Intezmenyvezeto, (int)VezetoiOraszamokTipusEnum.IntezmenyvezetoHelyettes }; if (fokuszEnabled.Contains(SDAConvert.ToInt32(ds.Tables[0].Rows[0]["C_VEZETOIORASZAMOK"]))) { szerepkorok.Add(KretaClaimPackages.FokuszMonitoring.ClaimValue); } var iskolaorEnabled = new List { (int)MunkakorTipusEnum.iskolaor }; if (iskolaorEnabled.Contains(SDAConvert.ToInt32(ds.Tables[0].Rows[0]["C_MUNKAKORTIPUSA"]))) { szerepkorok.Add(KretaClaimPackages.IskolaOr.ClaimValue); } } } if (loginInfo.BelepesiNev.Equals(Core.Constants.SpecialUserName.KretaAdminisztratorUserName, StringComparison.OrdinalIgnoreCase)) { szerepkorok.Add(KretaClaimPackages.Alkalmazott.ClaimValue); } return szerepkorok; } private static string[] s_allowedRoles = new string[] { KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.eUgyintezo.ClaimValue, KretaClaimPackages.Alairo.ClaimValue, KretaClaimPackages.Penztaros.ClaimValue, KretaClaimPackages.PenzugyiAdmin.ClaimValue, KretaClaimPackages.BelepokartyaAdmin.ClaimValue, KretaClaimPackages.LeltarConcerned.ClaimValue, KretaClaimPackages.Tanar.ClaimValue, KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.Tanulo.ClaimValue, KretaClaimPackages.Gondviselo.ClaimValue, KretaClaimPackages.CsokkentettGondviselo.ClaimValue, KretaClaimPackages.SZMKKepviselo.ClaimValue, KretaClaimPackages.EtkezesiAdmin.ClaimValue, KretaClaimPackages.EtkezesiEllenorzo.ClaimValue, KretaClaimPackages.TeremberletJelenletEllenorzo.ClaimValue, KretaClaimPackages.Alkalmazott.ClaimValue, KretaClaimPackages.IskolaEgeszsegugyiKoordinator.ClaimValue, KretaClaimPackages.Vedono.ClaimValue, KretaClaimPackages.Iskolaorvos.ClaimValue, KretaClaimPackages.IskolaEgeszsegugyiAsszisztens.ClaimValue, KretaClaimPackages.IskolaEgeszsegugyiLekerdezo.ClaimValue, KretaClaimPackages.GazdasagiUgyintezo.ClaimValue, KretaClaimPackages.FokuszMonitoring.ClaimValue, KretaClaimPackages.IskolaOr.ClaimValue, KretaClaimPackages.Konyvtaros.ClaimValue, KretaClaimPackages.FELTAR_EsetKezelo.ClaimValue, KretaClaimPackages.FELTAR_EszkozMenedzser.ClaimValue, KretaClaimPackages.KerdoivKitolto_KerdoivKezelo.ClaimValue, KretaClaimPackages.Dualis_Admin.ClaimValue, KretaClaimPackages.FELTAR_EsetJovahagyo.ClaimValue, KretaClaimPackages.FELTAR_EsetKozremukodo.ClaimValue, KretaClaimPackages.FELTAR_Munkavegzo.ClaimValue, KretaClaimPackages.FELTAR_SzerzodesMenedzser.ClaimValue, }; private static List NormalizeRoles(List roles) { var normalizedRoles = new List(roles); //sajnos a Gondviselo megkapja a Tanulo-t is, ezt itt kivesszük (a rendes megoldás az lesz, hogy a Gondviselo nem kapja meg belépéskor a Tanulo-t) if (normalizedRoles.Contains(KretaClaimPackages.Gondviselo.ClaimValue)) { normalizedRoles.Remove(KretaClaimPackages.Tanulo.ClaimValue); } normalizedRoles = normalizedRoles.Where(role => s_allowedRoles.Contains(role)).Distinct().ToList(); return normalizedRoles; } private static string CreateUrl(string baseUrl, AuthenticationInfo authenticationInfo, string key) { if (string.IsNullOrWhiteSpace(baseUrl)) { throw new ArgumentException(nameof(baseUrl)); } if (authenticationInfo == null) { throw new ArgumentNullException(nameof(authenticationInfo)); } if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentException(nameof(key)); } string token = JsonConvert.SerializeObject(authenticationInfo); string encryptedToken = UrlLogic.Encrypt(token, key); var builder = new UriBuilder(baseUrl); if (string.IsNullOrWhiteSpace(builder.Query)) { builder.Query = $"{TokenParameterName}={encryptedToken}"; } else { NameValueCollection query = HttpUtility.ParseQueryString(builder.Query); query.Add(TokenParameterName, encryptedToken); builder.Query = query.ToString(); } return builder.ToString(); } } }