Have you tried giving the puck a skeleton in the form of a singular root bone? If you do this, you can create an inverse kinematics function that will snap the puck to the floor. From there you may be able to get an average vector of the normals below the puck, then apply that to the rotational offset of it as well.
I’m not too sure how to do the second part quite yet, but I know that this video covers how IK procedural movement works and this should be a solid way to make the puck appear attached to the floor even thought its sliding over uneven ice. Just the first like 10ish minutes will cover what I was talking about and how to set it up, but feel free to skim through it.
I think this should work for your issue assuming that if the puck were to get launched into the air from a ramp, the puck would still appear to be attached to the floor. If you want the character to physically be attached to the floor however, you may consider amping the gravity up to an absurd level, and making it so your movement vector ignores the z axis, but heavily multiplies the x and y axis to compensate.