using System; using System.Web; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Web.Mvc; using System.Web.Http.Controllers; using System.Web.Script.Serialization; using Newtonsoft.Json; using ARC.GMP.Models; using System.Configuration; using System.Security.Principal; using ARC.GMP.Types; using System.Threading.Tasks; using NLog; namespace ARC.GMP.Utils { public class AuthorizeUserByRole : AuthorizeAttribute { private static ILogger _logger = LogManager.GetCurrentClassLogger(); private string _entity = string.Empty; private List _permissionSet = new List(); AuthenticationDetail authDetail = new AuthenticationDetail(); public AuthorizeUserByRole(string entity, string permissions) { _permissionSet = new List(permissions.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)); _entity = entity; } protected override bool AuthorizeCore(HttpContextBase httpContext) { string rolesJson = ""; string userAuthenticateUrl = ConfigurationManager.AppSettings.Get("UserAuthenticateUrl"); string userAuthorizeUrl = ConfigurationManager.AppSettings.Get("UserAuthorizeUrl"); string clientId = ConfigurationManager.AppSettings.Get("ClientId"); try { //Authentication var identity = httpContext.User.Identity as WindowsIdentity; if (identity == null) { return false; } string userName = identity.Name; var asyncTask = Task.Run(async () => { return await Task.Run(() => AccessPermissionManager.IsAuthenticatedAsync(userAuthenticateUrl, userName)); }); authDetail = asyncTask.Result; if (authDetail != null && authDetail.IsAuthenticated) { //Authorization bool isAuthorized = false; Tuple authorizationDetail = null; authorizationDetail = AccessPermissionManager.IsAuthorized(userAuthorizeUrl, null, authDetail, clientId); if (authorizationDetail != null) { isAuthorized = authorizationDetail.Item1; rolesJson = authorizationDetail.Item2; } if (isAuthorized) { return AccessPermissionManager.HasPermissions(rolesJson, _entity, _permissionSet); } else { return false; } } else { return false; } } catch (Exception ex) { _logger.Log(LogLevel.Trace, "Exception: " + ex.Message); return false; } } protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { base.HandleUnauthorizedRequest(filterContext); } } }