例如,我有一个网络API:http://example.com/api/product。
我有一个C#客户端来使用这个Web API。这样的东西可以获得完整的产品清单。
// List all products.
HttpResponseMessage response = client.GetAsync("api/products").Result; // Blocking call!
if (response.IsSuccessStatusCode)
{
// Parse the response body. Blocking!
var products = response.Content.ReadAsAsync<IEnumerable<Product>>().Result;
foreach (var p in products)
{
Console.WriteLine("{0}\t{1};\t{2}", p.Name, p.Price, p.Category);
}
}
else
{
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
}
如何将用户名和密码从C#客户端传递到服务器的API?我想要的是当C#客户端从Web API获取整个产品列表时。
客户端会将用户名和密码发送到服务器的API。如果服务器的web API检查它是否是数据库中的授权用户,如果不是,则不要让它获得产品列表。
答案 0 :(得分:0)
前一段时间我在概念验证中使用了以下方法,我希望它可以帮到你。
我写了这样的东西,一个带有两种方法的“AuthenticationController”:
public bool Login(string username, string password, bool rememberMe)
{
if (Membership.ValidateUser(username, password))
{
FormsAuthentication.SetAuthCookie(username, rememberMe);
return true;
}
return false;
}
public void Logout()
{
FormsAuthentication.SignOut();
}
Login方法创建一个将发送给客户端的cookie;然后,在每个请求中,您需要将其发送回服务器。您可以使用控制器操作中的[Authorize]属性来验证允许的角色和权限。
答案 1 :(得分:0)
我的建议是使用具有将令牌分配给客户端的身份验证例程。然后,客户端将缓存该令牌并在后续请求中传递该令牌。验证例程应该通过SSL来防止在线上嗅探,并且根本不应该存储在设备上(令牌可以缓存到设备上)。
这将使您对客户端有一定程度的控制权。然后,您的服务处于可以抢先停用客户端的位置(终止令牌并强制重新授权 - 基本上是一个超时的情况)。您还可以在客户端上保护您的应用程序(如果应用程序在设备上受到损害,则用户凭证不会被传递)。
您可以使用DotNetOpenAuth让您沿着这条路走下去。
[System.Web.Mvc.AcceptVerbs(HttpVerbs.Post)]
public ActionResult LogOn(string loginIdentifier)
{
if (!Identifier.IsValid(loginIdentifier))
{
ModelState.AddModelError("loginIdentifier",
"The specified login identifier is invalid");
return View();
}
else
{
var openid = new OpenIdRelyingParty();
IAuthenticationRequest request = openid.CreateRequest(
Identifier.Parse(loginIdentifier));
// Require some additional data
request.AddExtension(new ClaimsRequest
{
BirthDate = DemandLevel.NoRequest,
Email = DemandLevel.Require,
FullName = DemandLevel.Require
});
return request.RedirectingResponse.AsActionResult();
}
}
来源:Sample Code