允许用户登录 API
您需要随请求一起发送有效的表单身份验证 cookie。该 cookie 通常由服务器在通过调用[FormsAuthentication.SetAuthCookie 方法进行身份验证(LogOn 操作)时发送(参见MSDN)。
所以客户端需要执行2个步骤:
- 通过发送用户名和密码向
LogOn 操作发送HTTP 请求。反过来,此操作将调用 FormsAuthentication.SetAuthCookie 方法(如果凭据有效),该方法又会在响应中设置表单身份验证 cookie。
- 通过发送在第一个请求中检索到的表单身份验证 cookie,向受
[Authorize] 保护的操作发送 HTTP 请求。
让我们举个例子。假设您在 Web 应用程序中定义了 2 个 API 控制器:
第一个负责处理认证:
public class AccountController : ApiController
{
public bool Post(LogOnModel model)
{
if (model.Username == "john" && model.Password == "secret")
{
FormsAuthentication.SetAuthCookie(model.Username, false);
return true;
}
return false;
}
}
第二个包含只有授权用户才能看到的受保护操作:
[Authorize]
public class UsersController : ApiController
{
public string Get()
{
return "This is a top secret material that only authorized users can see";
}
}
现在我们可以编写一个使用此 API 的客户端应用程序。这是一个简单的控制台应用程序示例(确保您已安装 Microsoft.AspNet.WebApi.Client 和 Microsoft.Net.Http NuGet 包):
using System;
using System.Net.Http;
using System.Threading;
class Program
{
static void Main()
{
using (var httpClient = new HttpClient())
{
var response = httpClient.PostAsJsonAsync(
"http://localhost:26845/api/account",
new { username = "john", password = "secret" },
CancellationToken.None
).Result;
response.EnsureSuccessStatusCode();
bool success = response.Content.ReadAsAsync<bool>().Result;
if (success)
{
var secret = httpClient.GetStringAsync("http://localhost:26845/api/users");
Console.WriteLine(secret.Result);
}
else
{
Console.WriteLine("Sorry you provided wrong credentials");
}
}
}
}
以下是 2 个 HTTP 请求在网络上的样子:
认证请求:
POST /api/account HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: localhost:26845
Content-Length: 39
Connection: Keep-Alive
{"username":"john","password":"secret"}
认证响应:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 13 Jun 2012 13:24:41 GMT
X-AspNet-Version: 4.0.30319
Set-Cookie: .ASPXAUTH=REMOVED FOR BREVITY; path=/; HttpOnly
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 4
Connection: Close
true
请求保护数据:
GET /api/users HTTP/1.1
Host: localhost:26845
Cookie: .ASPXAUTH=REMOVED FOR BREVITY
对受保护数据的响应:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 13 Jun 2012 13:24:41 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 66
Connection: Close
"This is a top secret material that only authorized users can see"