Hi V,
My network is setup very similar to your customers.
Here's what I do. My "Spokes" only have a default router to provider's MPLS cloud. Out of my primary DC I advertise a default router via BGP (using network 0.0.0.0). This provides all my branches a default router to the cloud. From my secondary DC, I have a static pointing to my DR-internet connection. At the DR location, I advertise the default route as well, but pre-pend a couple ASNs to the AS-Path. I use a prefix-list and route-map to do this.DR location advertises local subnets as well.
Thist setup allows me to have a "failover" default route in the following situations:
1. Primary internet connection goes down at DC- Default route advertised out of Primary location is tied to a track object. If I can't ping my ISP next-hop IP, consider it down. This removes the default route from the primary, which also removes it from Spoke routers. This allows the "Backup" default route to take over, even for the primary location. Users / Servers at primary DC use DR-internet connection to get out as well as the spokes. Spokes can still access server resources from primary DC, but internet is via secondary DC.
2. Primary DC disappears (Disaster, circuit failure etc)- Default route disappears from cloud-routers and default route pointing to secondary DC takes over and everyone gets routed there.
It's a fairly simple setup, but does the trick well in my situation.
As for active-active,
You can work some magic with secondary IPs on servers at the DR location, in the event of a primary location failure, the clients at the spokes could access things via the same IP at the DR location. Would take a few tweaks to the servers, but it is do-able.