0

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

4

2 回答 2

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,该 cookie 将被发送到客户端;然后,在每个请求中,您需要将其发送回服务器。您可以在控制器操作中使用 [Authorize] 属性来验证允许的角色和权限。

于 2013-04-10T01:12:07.423 回答
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();
    }
}

来源:示例代码

于 2013-04-10T01:12:50.237 回答