Simply put, ASIC stand for Application Specific IC, which is a custom-designed chip. When you have, for example, a design on FPGA or a complete design, and you want to create a specific chip that include the design, you send to an ASIC manufacturer and they build you an ASIC. Examples are controlers, memory, ...
SoC stand for System on a Chip. You remember in the old days, where you had a PC motherboard, with dozens of chips (one for timers, one for parallel port, one for memory management, one for ROM, ...). Well, today, there are newer chips that incorporate many of those functions on a single chip (like the north-bridge and south-briges adapters).
If you think of an even denser design, where you could have an application that have processor, memory (optionally), controlers and peripherials on a single chip, that is a SoC. This could be used in applications that need tight space, or fewer components. Remember that on the long run, less components equal less $$$.
SoC can be a package like an IP core too, that is used on FPGA.
At least, that is my understanding of it!