Well the simple option would be to use the inbuilt shadow lights.

As for a more complicated solution:

The first thing that comes to mind is for each tile find every nearby light, calculate the distance then pick the shortest distance.

If your game has less than 10 lights then this is fine, the cost is minimal. If your going to allow the users to place lights... Well you could have 10 thousand plus it's going to run slowly. So how to speed it up?

First optimisation is to use the Manhattan distance instead of Pythagoras. Much faster, but it's visually quite different ( diamonds not circles ). This normally suits tile/voxel based games though.

Second trick is spatial partitioning. If the maximum range of a light is 8 tiles, then split the world up into 8x8 chunks. When you need to look for nearby lights you only need to check the current chunk and it's immediate neighbours. This makes for a worst case of 575 lights to check, instead of the whole world, and finding the lights is pretty simple.

If you want to simulate sunlight then a good trick is treat every tile that has no obstruction above it as a light source. This gives you an approximation of indirect illumination for sunlight, which is nice.

You should only be updating these light values if the world changes, not every tick. If you use spatial partitioning then it's easy enough to update the 9 chunks centered around the changed tile which could be affected. For sunlight it's a little more fiddly unfortunately...

There is another trick you can do which improves the quality of your lighting, but I'm not sure how you'd manage it in Construct. Basically the trick is to calculate light for the corners of tiles instead, then interpolate it across the tile to give you smooth lighting changes. If you make solids completely dark then this will also give you an Ambient Occlusion effect.