I need some help figuring out whether it'd be a good idea to use a CMS or portal solution for my latest project, which is (currently) an ASP.NET MVC application that must serve multiple customers (being a company or some other entity with a list of users) from a single installation (that is, a SaaS solution).
In addition to the core functionality, which includes document management/publishing, I also need to provide basic social features (such as blog, forum, gallery, polls, etc.). However, it is imperative that content is only visible for the customer to which it belongs, and my evaluation of a bunch of CMS and portal solutions has shed little light on whether they support this. They're pretty focused on single-user installations, and documentation on how to integrate with an existing MVC solution is pretty thin.
Essentially I'm looking for some guidance to help me discard dead-end options (the product does not meet requirements, imposes too many restrictions, is not mature, etc.) and find unexplored options before getting too far ahead with the project.
My requirements for the architecture include:
- Multi-site support (using a single domain for hosting)
- Watertight separation of content between customers
- Full integration across components/features
- SSO (single-sign-on)
- Single-site experience (shared header/footer, unified navigation, unified tags, etc.)
- Ease of development and deployment
- Custom logic will be written using C# and ASP.NET MVC and any products should support this
- I want to stay in control
- Solution should offer features but otherwise stay out of the way (for example, not force stupid idioms on me, like insisting on GUIDs for primary keys)
- Active development community
- No single-man efforts
- Recent source control activity
- Reasonable levels of documentation and maturity
- Does not have to be open source
I have spent a fair amount of time evaluating products and components, which I'll briefly share here:
-
Umbraco
- Does not support ASP.NET MVC (yet, as someone is bound to otherwise comment)
- Great community support, active development
- Seems to be lots of work to get started
-
Kooboo
- No source activity (no updates for almost two months)
- GPL licensed? (need something that allows for closed source applications)
-
N2CMS
- Partial ASP.NET MVC support
- Every customer must have a separate domain
- Limited source activity (not dead but not vibrant either)
-
Orchard
- Microsoft-sponsored (which means it's likely to be over-architected, code-bloated and slow, although it does have some well known and respected contributors/leads)
- Built using ASP.NET MVC
- Looks promising feature-wise (but is unlikely to be stable at this stage)
-
AtomSite
- Feels reasonably mature and has decent documentation, albeit with holes
- Built using ASP.NET MVC
- Limited source activity, single developer
-
MojoPortal
- Looks good for a portal, but probably requires custom logic to be built as modules around the product (I was hoping to avoid that kind of lock-in if possible)
-
DotNetNuke (DNN), CommunityServer and Microsoft Office SharePoint Server (MOSS)
- Definitely not my cup of tea ;)
-
BlogEngine.NET
- Mature and feature-complete
- No ASP.NET MVC support
- Integration possible but not without lots of Web.config voodoo
- Not sure if it supports customer separation
Given the list above I'm leaning towards AtomSite, N2CMS, Orchard or BlogEngine.NET. If I go with the latter I'll be using jitbit AspNetForum, which is a great match for my needs.
I'd probably prefer to use a custom ASP.NET MVC solution and individual components as this is likely to give me the greatest amount of control, but on the other hand, it'll make site theming and integration harder. What combinations have you tried, what worked well and what didn't? Anything important I'm leaving out of my evaluation? Any other relevant advice?
I'd appreciate it if the answers were not simply endorsements of your favorite product or way of doing things, but something that would help me choose or eliminate solution candidates given the requirements outlined above.
With the level of requirements you've specified, I'm personally going to have to lean towards the custom approach. You can hire someone to do the design (view) portion of the site for you, or you can buy a theme off the internet from site designers and customize it to your liking. (Sometimes just having somewhere to start is enough for intermediate level customization).
-
Multi-site support (using a single domain for hosting)
- You're probably going to want to have control of your hosting environment, either a VPS (Virtual Private Server) or a dedicated box. This is still possible on shared hosting but not reccomended.
-
Watertight separation of content between customers
- You'd probably have to spawn a unique app-pool for each customer with thier own services user for 100% seperation.
-
Full integration across components/features / SSO (single-sign-on) /Single-site experience (shared header/footer, unified navigation, unified tags, etc.)
- This is going to be the tricky part. This Example may have some useful insight for you in the development process, but you're going to want a unified login service and have all sites use it or link to it.
-
Ease of development and deployment
- This is where it gets tricky. Development ease comes from your background I think. MVC is definately the right choice in this respect then, knowing a lot about the right ways of going about building a site in MVC will aid in this process. Keep up to date by reading community blogs and listening to podcasts like Hanselminutes or DotNetRocks will help keep you in touch with the newest and greatest tools/technologies for making your site get off the ground quickly and effectively.
-
Deployment is the tricky spot. MSDeploy still isn't quite there. But if you can you probably will want to come up with a Dev -> Staging -> Release publish structure so you can test your code in a staging (mimiced production) environment.
-
Custom logic will be written using C# and MVC and any products should support this
I want to stay in control
- If you develop the site in ASP.NET-MVC, you'll be able to build common libraries that you can use not just in your site, but also in your custom tooling. This will greatly reduce your code duplication and helps make sure operational unity is achieved. (Everything works the same way).
-
Solution should offer features but otherwise stay out of the way (e.g. not force stupid idioms on me, like insisting on GUIDs for primary keys)
- While you'll have control in this situation, I'd strongly reccomend GUID Primary Keys. This allows Merge Replication, which can help you easily restore backups or use failover DB servers when things go awry.
-
Active development community
- .NET has a great community out there, (including this one) and you should get lots of support if you ask for it politely.
-
No single-man efforts
- Not sure what you mean here, You'd be the Single-Man unless you hire help, but even 2 people can do great things given a little time. Even one-man can do great things, but the framework you're running on here is backed by a commercially funded huge team.
-
Recent source control activity
- Doesn't really apply to .NET, but a lot of the libraries that you may use (NHibernate, MVC Contrib, AutoFac, Etc...) will have lots of activity and constantly being improved.
-
Reasonable levels of documentation and maturity
- .NET and most of the production level libraries developed for .NET (Mentioned above) actually have a pretty good degree of documentation. There's multiple paid & non-paid sources of information for .NET alone, and most libraries (are well supported by the community and known on StackOverflow)
-
Does not have to be open source
- Look for support libraries that are LGPL (i.e. you can use it in commercial software, but if you modify the library you have to release the new library code if you release the binary.) You're pretty safe here, your site dosen't have to be open source if you use these libraries to support your development.
Well, that's my 2cents. The project you've described is no small job, you're looking at a considerable amount of work even if you go with a pre-built solution (mainly hacking it to work the way you want). I imagine your biggest hangups would be SSO & Security for the pre-done solutions. Not to say it's impossible, just tricky and the end result may not be exactly what you're looking for.
Also, look into OpenID, it may be the best solution for linking all your sites together and most pre-built systems can easily be ported to use it.