private static IEnumerable <Claim> GetClaims(LussEntity entity) { List <Claim> claimset = new List <Claim>(); claimset.Add(new Claim(config.NameClaimType, entity.DeviceId)); claimset.Add(new Claim(config.RoleClaimType, entity.VirtualRtuId)); return(claimset); }
private static string GetEdgeSecurityToken(LussEntity entity) { List <Claim> claims = new List <Claim>(); claims.Add(new Claim(config.NameClaimType, entity.DeviceId)); claims.Add(new Claim(config.RoleClaimType, entity.VirtualRtuId)); JsonWebToken jwt = new JsonWebToken(config.SymmetricKey, claims, Convert.ToDouble(config.LifetimeMinutes), config.Issuer, config.Audience); return(jwt.ToString()); }
private static AuthorizationPolicy CreateCaplPolicy(LussEntity entity, bool publishPolicy, out string policyIdUriString) { string policyId = publishPolicy ? String.Format("http://www.skunklab.io/policy/{0}/unitid{1}-in", entity.VirtualRtuId, entity.UnitId) : String.Format("http://www.skunklab.io/policy/{0}/unitid{1}-out", entity.VirtualRtuId, entity.UnitId); string claimType = publishPolicy ? config.RoleClaimType : config.NameClaimType; string claimValue = publishPolicy ? "vrtu" : String.Format("fieldgateway{0}", entity.UnitId); policyIdUriString = policyId; return(GetPolicy(policyId, claimType, claimValue)); }
private static async Task <EdgeGatewayConfiguration> ProvisionAsync(string luss) { LussEntity entity = await LussEntity.LoadAsync(luss, config.LussStorageTableName, config.StorageConnectionString); if (entity == null || entity.Success.HasValue || entity.Expires < DateTime.Now) { return(null); } //get the security token to call Piraeus mgmt api IEnumerable <Claim> claims = GetClaims(entity); string accessToken = GetPiraeusAccessToken(); //create the CAPL policies string publishPolicyId = null; string subscribePolicyId = null; AuthorizationPolicy pubPolicy = CreateCaplPolicy(entity, true, out publishPolicyId); AuthorizationPolicy subPolicy = CreateCaplPolicy(entity, false, out subscribePolicyId); //add the CAPL policies to Piraeus AddCaplPolicy(pubPolicy, accessToken); AddCaplPolicy(subPolicy, accessToken); //create the pi-system metadata string inputUriString = GetEventUriString(entity, true); string outputUriString = GetEventUriString(entity, false); EventMetadata inputMetadata = GetEventMetadata(inputUriString, publishPolicyId, subscribePolicyId, (ushort)entity.UnitId, true); EventMetadata outputMetadata = GetEventMetadata(outputUriString, subscribePolicyId, publishPolicyId, (ushort)entity.UnitId, false); //add the pi-systems to Piraeus AddEventMetadata(inputMetadata, accessToken); AddEventMetadata(outputMetadata, accessToken); //update the RTU Map RtuMap map = RtuMap.LoadFromConnectionStringAsync(config.RtuMapStorageContainerName, config.RtuMapFilename, config.StorageConnectionString).GetAwaiter().GetResult(); if (map == null) { map = new RtuMap(); } else { if (map.HasItem((ushort)entity.UnitId)) { map.Remove((ushort)entity.UnitId); } } map.Add((ushort)entity.UnitId, inputUriString, outputUriString); map.UpdateMapAsync(config.RtuMapStorageContainerName, config.RtuMapFilename, config.StorageConnectionString).GetAwaiter(); //update the LUSS entity entity.Access = DateTime.UtcNow; if (!entity.Success.HasValue) { entity.Success = true; } await entity.UpdateAsync(); string edgeSecurityToken = GetEdgeSecurityToken(entity); //create the cofiguration to return EdgeGatewayConfiguration edgeConfig = new EdgeGatewayConfiguration() { Hostname = entity.Hostname, ModBusContainer = entity.ModbusContainer, ModBusPort = entity.ModbusPort, ModBusPath = entity.ModbusPath, RtuInputPiSystem = inputUriString, RtuOutputPiSsytem = outputUriString, SecurityToken = edgeSecurityToken, UnitId = entity.UnitId }; return(edgeConfig); }
private static string GetEventUriString(LussEntity entity, bool inbound) { return(inbound ? String.Format($"http://{config.PiraeusHostname}/{entity.VirtualRtuId}/unitid{entity.UnitId}-in") : String.Format($"http://{config.PiraeusHostname}/{entity.VirtualRtuId}/unitid{entity.UnitId}-out")); }