使用成员资格提供程序的ASP.NET MVC 4 Web API身份validation

我有一个ASP.NET MVC 4项目使用Web API。 在控制器上,我使用[Authorize]属性将类设置为需要授权。 对于身份validation我正在使用ASP.NET成员资格提供程序,并将我的Web.Config设置为使用“窗体”身份validation。 这里是我卡住的地方:

一切工作都很好,直到我完成了testingAPI,我想用[Authorize]属性来保护控制器,这样我就可以开始在我的Membership Provider中对用户进行身份validation了。 因此,我激发了提琴手,并进行相同的调用,添加Authorization:Basic属性以及来自我的成员资格提供者的用户名:password,如下所示:

在这里输入图像描述

我得到的答复是401未经授权,并在“身份validation”下,我得到“没有WWW身份validation标题存在”。 然后我意识到API正在寻找一个SHA1编码密钥。 因此,我从search引擎中启动了一个SHA1生成器,并为我的用户名:密码获取一个散列值,并更新我的请求头,如下所示:

在这里输入图像描述

这也不起作用,我得到相同的结果。 此外,我显然需要某种“共享密​​钥”与服务器一起使用来解码我的用户名/密码。

所以我的问题:

  1. 我如何从服务器获得这个密钥(或者在这种情况下,运行VS 2012的虚拟IIS)。
  2. 如何使用这个在Fiddler中使用来自ASP.NET成员资格提供程序的用户名/密码进行身份validation的调用。
  3. 我将如何在我的客户端应用程序中使用它来进行相同的调用(C#WPF应用程序)。
  4. 当我的HTTP调用与SSL结合时,这是否最好? 如果不是什么?

提前致谢!

您可以使用SSL进行基本身份validation 。 在服务器端,我们可以编写一个自定义的委托处理程序,通过查询我们注册的memebership提供程序validation凭据,如果有效,检索angular色并设置当前的委托人:

public class BasicAuthenticationMessageHandler : DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var authHeader = request.Headers.Authorization; if (authHeader == null) { return base.SendAsync(request, cancellationToken); } if (authHeader.Scheme != "Basic") { return base.SendAsync(request, cancellationToken); } var encodedUserPass = authHeader.Parameter.Trim(); var userPass = Encoding.ASCII.GetString(Convert.FromBase64String(encodedUserPass)); var parts = userPass.Split(":".ToCharArray()); var username = parts[0]; var password = parts[1]; if (!Membership.ValidateUser(username, password)) { return base.SendAsync(request, cancellationToken); } var identity = new GenericIdentity(username, "Basic"); string[] roles = Roles.Provider.GetRolesForUser(username); var principal = new GenericPrincipal(identity, roles); Thread.CurrentPrincipal = principal; if (HttpContext.Current != null) { HttpContext.Current.User = principal; } return base.SendAsync(request, cancellationToken); } } 

然后我们在Application_Start注册这个处理Application_Start

 GlobalConfiguration.Configuration.MessageHandlers.Add( new BasicAuthenticationMessageHandler() ); 

现在我们可以有一个Api控制器,它将用[Authorize]属性进行修饰,以确保只有通过身份validation的用户才能访问其操作:

 [Authorize] public class ValuesController : ApiController { public string Get() { return string.Format("Hello {0}", User.Identity.Name); } } 

好吧,现在我们来看一个示例客户端:

 using System; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Text; class Program { static void Main() { // since for testing purposes I am using IIS Express // with an invalid SSL certificate I need to desactivate // the check for this certificate. ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true; using (var client = new HttpClient()) { var buffer = Encoding.ASCII.GetBytes("john:secret"); var authHeader = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(buffer)); client.DefaultRequestHeaders.Authorization = authHeader; var task = client.GetAsync("https://localhost:44300/api/values"); if (task.Result.StatusCode == HttpStatusCode.Unauthorized) { Console.WriteLine("wrong credentials"); } else { task.Result.EnsureSuccessStatusCode(); Console.WriteLine(task.Result.Content.ReadAsAsync<string>().Result); } } } }