I have an ASP.NET MVC 4 Project using the Web API. On the controller I have set the class to require authorization using the [Authorize] attribute. For Authentication I am using the ASP.NET Membership Provider and have my Web.Config set to use "Forms" Authentication. Here is where I am stuck:
Everything is working great up until the point that I am done with testing the API and I want to secure the controller with the [Authorize] attribute so I can start testing authentication against users in my Membership Provider. So I fire up Fiddler and make the same call adding the Authorization:Basic attribute along with a username:password from my membership provider like so:
The response I get is 401 unauthorized and under "Auth" I get "No WWW-Authenticate Header is present." Then I realize that the API is looking for an SHA1 encoded key. So I fire up an SHA1 generator from a search and get a hash for my username:password and update my Request Header like so:
This does not work either and I get the same results. Also I obviously need some sort of "shared secret key" to use with the server to decode my username/password.
So my questions:
- How do I get this key from the server (or in this case Virtual IIS running off VS 2012).
- How do I use this to make Authenticated calls in Fiddler using usernames/passwords from an ASP.NET Membership Provider.
- How will I use this in my client application to make the same calls (C# WPF App).
- Is this best practive when combined with SSL on my HTTP calls? If not what is?
Thanks in advance!
You could use basic authentication with SSL. On the server side we could write a custom delegating handler which will verify the credentials by querying the memebership provider that we registered, and if valid, retrieve the roles and set the current principal:
We then register this handler in
Application_Start
:Now we could have an Api controller that will be decorated with the [Authorize] attribute to ensure that only authenticated users can access its actions:
Alright, now let's look at a sample client: