views:

186

answers:

5

Our clients must pay a monthly Fee... if they don't, what is the best way to block the asp.net software usage? Note: The application runs on the client own server, its not a SaaS app...

My ideas are:

Idea: Host a Web Service on the internet that the application will use to know if the client can use the software. Issue 1 - What happen if the client internet fails? Or the data center fails? Possible Answer: Make each web service access to send a key that is valid for 7 or 15 days, so each web service consult will enable the software to run more 7 or 15 days, this way the application will only be locked after 7 or 15 days without consulting our web servicee. Issue 2 - And if the client don't have or don't want to enable internet access to the application?

Idea 2: Send a key monthly to the client. Issue - How to make a offline key? Possible Answer: Generate a Hash using the "limit" date, so each login try on software will compare the today hash with the key? Issue 2 - Where to store the key? Possible Answer: Database (not good, too easy to change), text file, registry, code file, assembly...

Any opinion will be very appreciated!

+3  A: 

usually you provide an scrambled key that includes a valid authorization token and the expiration date through which service is paid. Then the installer will use this to "activate" your software. Not sure how this would be viewed if you have 1-2 week periods. you'd want to warn them about upcoming expiration. Also not sure how to tell if they've set their own clock back.

In short, nothing will be perfect.

No Refunds No Returns
+1 for the "setting the clock back" point. The system should be calendar independent (or as much as possible). One way to do this would be to *never* rely on the local system's clock and always ask the licence server what time it is. This requires a persistent network connection and daily "check-ins" with the licence server.
FrustratedWithFormsDesigner
+7  A: 

Ah, the age old issue of DRM. And that's what you're talking about here. Frankly, the fundamental answer to your question is: you can't. No matter what you do to the system, it can be hacked and modded in such a way that your DRM authentication scheme can be bypassed and/or broken.

This is a fundamental fact of software development: it can and will be pirated.

So, the answer to your question is that you will have to trust the client to pay you the fees you determine to be correct (which is the whole point of contracts in this situation).

Any other actions you take are a hardship and annoyance on your paying customer, and has the potential to erode your customer base.

Now, if you want control of your software in the nature described, then do not provide it to users to run on their own servers. Force them to be SaaS. In that way, you control all of that. But this is the only way.

Something that you don't appear to be thinking about, but I have seen networks which do not allow any type of "dial home" solutions, as a majority of the systems were internally focused and thus these internal servers were NOT allowed to contact the outer internet. At all. It was deemed a security risk to even allow them access. How would you handle those networks?

Frankly, if I was the customer, and I paid my fees to license your software (which I installed on my own device) I would be irate if I had to allow that device access to the internet in order for it to work. Doubly so, if the software in question was any type of financial management, customer management, HR management, quality management, inventory management, sales, or just anything related to my business, customers or employees. I don't trust software developers enough to have their software talk to something else when my business-relevant data is held in their software.

In the end, what you are describing is an antagonistic approach to take with your paying customers. If you don't believe me, look at the comments that UbiSoft is getting for their latest customer-hating DRM scheme.

IMO, you have two good paths here:

  1. Go SaaS
  2. Ensure your contract has a bite for non-payment
Stephen Wrighton
And for #2., make sure you can enforce the contract when (not if) it is necessary.
FrustratedWithFormsDesigner
Our software can be pirated, but won't. Thats because we deliver only extremely customized softwares, totally focused on the client issue, nad probably no one in the world has exactly the same variables as this client, so no one will find a way to use the software to solve any problem.And its because of it beeing so customized that we must control the access, we need to take the highest profit from the same client as the time goes on, if the client find a way to use it without paying, then the software can be throw at the trash bin, we won't sell it to any other client cuz no one will want it
Tufo
@frustrated - hence the "bite" statement. @Tufo - And? your statement changes nothing. Truth is, that most of the software I build is extremely customized for my clients. Which is why I charge hourly for the creation of the software, and then forget about it, until I charge hourly again when they want changes.
Stephen Wrighton
+2 Stephen. To add more: they will always need some modifications, support service, troubleshooting, ...etc. And if they try to pirate your software, sure, they will pay more when they need you. The contract will help you then.
Sameh Serag
A: 

I've dealt with this before and its not possible to make a perfect system. There are risks in anything you do. The best thing is to weigh your options, and determine the method that has the least likelihood of being hacked and the most likelihood of working correctly and easily for the customer.

Like others have said, they could change their clock and invalidate the license checking mechanism. If you didn't trust the user, you could make the license system connect to your servers. You would then need to ensure that they always have a connection to your servers to check the license.

What if there is a valid reason that they cannot access your server?

  • Their internet connection has a problem.
  • YOUR internet connection has a problem.

In that case, should you disable the application? Probably not. But then again, what if they shut down the connection on purpose? Then you would WANT to disable the application.

If you give them a monthly key, you're adding a monthly annoyance and you may lose a customer after a while (people tend to do business with those who make it easy).

For example: If you base it on their clock, and the application needs their clock to be accurate for some reason, then its unlikely that the customer will change their clock.

Gabriel McAdams
A: 

I agree with Stephen but ultimately, I think that your contract is your best ally here.

As been previously mentioned, you don't want to inconvenience customers, especially if you have a large deployment.

As for SaaS, if I were a customer using your product and you said that the model is changing and we need to access the software from your server and ours must be decommissioned, I'd not be happy. I'd probably use the opportunity to switch packages.

Frank V
A: 

In corporate settings, the contract really is the best way to handle these issues. I've worked on licensing issues for desktop and ASP.NET applications and they can cause a number of headaches for both you and your client.

However, if you insist on using something like this I suggest you go with a middle ground. Instead of only unlocking the application for a week or two, provide a license for 6 months or a year. This way, if you run into licensing issues (and you will run into issues) they only occur once a year rather than a couple of times per month. That will be cheaper for you in support and your clients will be less unhappy about dealing with licensing issues. If the company stops paying and you need to terminate the license you can handle that on a one-off basis, using contract enforcement as needed.

On the web service or client license options, I think a good license system would incorporate both. A client license to provide a the application a stable license and a web service to generate and deliver the license key when it is time for the application to be renewed. If the client won't allow the application to call home to get the license key also provide a manual entry method.

If you are going to store a license on the client, do not try to build a component yourself. There are many components available which will be much more robust and reliable than the one you build. There is a .NET .licx-based licensing method and a number of 3rd party methods that you can use. Which one is most appropriate depends on your scenario: how flexible you want the license and what other options you need. Most importantly, find something reliable - any time your customers spend fixing problems caused by licensing is non-productive for them and will reflect poorly on the application.

The important thing to keep in mind is that no system is fool proof. If your application is valuable, someone is going to figure out how to steal it. But at the corporate level and with custom software it's more likely the licensing will be used to remind people to pay rather than stop wholesale piracy.

Steven Lyons