Is there an alternative to the Geometry -> Normal Output?
Taking the dot-product of the Normal output of the Texture Coordinate node with (0,0,1) will return the Z component of the surface normals, in Object space.

This ring has a curved profile on the inside, and is tapered on the outside.
This discrimination is good.. if you had displacements on the curved surfaces which resulted in |Z| = 1 normals, you could further discriminate by absolute Z location in Generated texture space...

Either way.. or both ?