使用GET将用户名/密码从客户端传递到Web API

时间:2013-04-10 00:53:44

标签: asp.net asp.net-web-api

例如,我有一个网络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检查它是否是数据库中的授权用户,如果不是,则不要让它获得产品列表。

2 个答案:

答案 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