ChatGPT解决这个技术问题 Extra ChatGPT

ASP.NET Web API 中的用户身份验证

这个话题让我非常困惑。我是 HTTP 应用程序的新手,但需要开发一个从某个地方使用 JSON 数据的 iPhone 客户端。我选择 MS 的 Web API 是因为它看起来很简单,但是在验证用户时,事情变得非常令人沮丧。

经过几个小时的谷歌搜索,我无法找到一个清晰的示例,说明如何从登录屏幕到在我的 ApiController 方法上使用 Authorize 属性来验证用户。

这不是一个问题,而是要求提供一个如何准确执行此操作的示例。我查看了以下页面:

使您的 ASP.NET Web API 安全

使用 ASP.NET Web API 的基本身份验证

尽管这些解释了如何处理未经授权的请求,但它们并没有清楚地展示像 LoginController 或类似的东西来请求用户凭据并验证它们。

有人愿意写一个简单的例子或指出正确的方向吗?

谢谢。

我已经回答了同样的问题:stackoverflow.com/questions/11775594/…
对于带有 asp.net 的 Web Api,您可以像使用 mvc 应用程序(如果您愿意)一样使用 cookie 和 formsauthentication 模块。因此,在您的 web api 代码中,您可以检查主体以查看用户是否已登录,例如(与以前相同)。
另请查看我对 stackoverflow.com/questions/11775594/… 的回答
我强烈推荐很多人阅读asp.net/web-api/overview/security/…文章。

J
Jon Schneider

我很惊讶在几个小时的谷歌搜索之后,我无法找到一个清晰的例子来说明如何从登录屏幕到在我的 ApiController 方法上使用 Authorize 属性对用户进行身份验证。

那是因为您对这两个概念感到困惑:

身份验证是系统可以安全地识别其用户的机制。身份验证系统提供了以下问题的答案:用户是谁?用户真的是他/她代表自己的那个人吗?

用户是谁?

用户真的是他/她代表自己的那个人吗?

授权是系统确定特定经过身份验证的用户对系统控制的安全资源应具有的访问级别的机制。例如,数据库管理系统可能被设计为向某些特定个人提供从数据库中检索信息的能力,但不能更改存储在数据库中的数据的能力,同时赋予其他人更改数据的能力。授权系统提供了以下问题的答案:用户 X 是否有权访问资源 R?用户 X 是否被授权执行操作 P?用户 X 是否有权对资源 R 执行操作 P?

用户 X 是否有权访问资源 R?

用户 X 是否被授权执行操作 P?

用户 X 是否有权对资源 R 执行操作 P?

MVC 中的 Authorize 属性用于应用访问规则,例如:

 [System.Web.Http.Authorize(Roles = "Admin, Super User")]
 public ActionResult AdministratorsOnly()
 {
     return View();
 }

上述规则将只允许管理员和超级用户角色的用户访问该方法

也可以使用 location 元素在 web.config 文件中设置这些规则。例子:

  <location path="Home/AdministratorsOnly">
    <system.web>
      <authorization>
        <allow roles="Administrators"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>

但是,在执行这些授权规则之前,您必须通过当前网站的身份验证。

尽管这些解释了如何处理未经授权的请求,但它们并没有清楚地展示像 LoginController 或类似的东西来询问用户凭据并验证它们。

从这里,我们可以将问题一分为二:

在同一个 Web 应用程序中使用 Web API 服务时对用户进行身份验证 这是最简单的方法,因为您将依赖 ASP.Net 中的身份验证 这是一个简单的示例:Web.config 用户将被重定向到 account/login 路由,那里您将呈现自定义控件以询问用户凭据,然后您将使用以下方法设置身份验证 cookie: if (ModelState.IsValid) { if (Membership.ValidateUser(model.UserName, model.Password)) { FormsAuthentication.SetAuthCookie(model.UserName , 模型.RememberMe); return RedirectToAction("Index", "Home"); } else { ModelState.AddModelError("", "提供的用户名或密码不正确。"); } } // 如果我们走到这一步,有些事情失败了,重新显示表单 return View(model);

跨平台身份验证这种情况是当您仅在 Web 应用程序中公开 Web API 服务时,您将有另一个客户端使用这些服务,该客户端可以是另一个 Web 应用程序或任何 .Net 应用程序(Win Forms、WPF、控制台, Windows 服务等)例如,假设您将从同一网络域(内联网内)上的另一个 Web 应用程序使用 Web API 服务,在这种情况下,您可以依赖 ASP.Net 提供的 Windows 身份验证。 如果您的服务暴露在 Internet 上,那么您需要将经过身份验证的令牌传递给每个 Web API 服务。有关更多信息,请查看以下文章:http://stevescodingblog.co.uk/basic-authentication-with-asp-net-webapi/ http://codebetter.com/johnvpetersen/2012/04/02/使您的asp-net-web-apis-安全/

http://stevescodingblog.co.uk/basic-authentication-with-asp-net-webapi/

http://codebetter.com/johnvpetersen/2012/04/02/making-your-asp-net-web-apis-secure/


哇!这就是我所说的答案。所以,总结一下。我计划执行以下操作: 1. 使用 Login 方法创建一个帐户控制器,该方法通过 HTTPS 接收用户名和密码并返回登录结果和令牌。 2. 客户端存储令牌,并将其作为请求头(不再使用 HTTPS)发送到 Web 服务器验证的请求中。这是一个好方法吗?那么我最后的疑惑就是如何控制token的篡改和过期。这可能吗?
@Jupaol 我想我代表许多 Web API 开发人员,我不能使用表单身份验证,因为我没有网站并且客户端没有使用浏览器,我也不能使用集成身份验证,因为用户可以在世界任何地方使用任何设备(因此是 Web API),那我用什么?
我不明白为什么这个答案会得到如此多的支持。这不是关于 ASP.NET Web API 而是关于 ASP.NET MVC。
我想重申 B413 的评论并指出这个问题专门要求 Web API
这是对 SO 投票最多的“错误”答案吗?答案实际上并没有谈论与 mvc web 应用程序非常不同的 web api!就像@B413 我完全震惊了!
E
Edward Brey

如果您想根据用户名和密码没有授权 cookie 进行身份验证,MVC4 Authorize 属性将无法开箱即用。但是,您可以将以下辅助方法添加到控制器以接受基本身份验证标头。从控制器方法的开头调用它。

void EnsureAuthenticated(string role)
{
    string[] parts = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(Request.Headers.Authorization.Parameter)).Split(':');
    if (parts.Length != 2 || !Membership.ValidateUser(parts[0], parts[1]))
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "No account with that username and password"));
    if (role != null && !Roles.IsUserInRole(parts[0], role))
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "An administrator account is required"));
}

从客户端,此帮助程序创建一个带有身份验证标头的 HttpClient

static HttpClient CreateBasicAuthenticationHttpClient(string userName, string password)
{
    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(userName + ':' + password)));
    return client;
}

只是想评论一下,我正在寻找一种简单的方法来使用行业标准在标题中传递凭据。这个例子展示了服务器端和客户端的基础知识,这就是我所需要的。
P
ProfNimrod

我正在开发一个 MVC5/Web API 项目,需要能够获得 Web Api 方法的授权。当我的索引视图首次加载时,我会调用我认为是自动创建的“令牌”Web API 方法。

获取令牌的客户端代码(CoffeeScript)是:

getAuthenticationToken = (username, password) ->
    dataToSend = "username=" + username + "&password=" + password
    dataToSend += "&grant_type=password"
    $.post("/token", dataToSend).success saveAccessToken

如果成功,将调用以下命令,将身份验证令牌保存在本地:

saveAccessToken = (response) ->
    window.authenticationToken = response.access_token

然后,如果我需要对具有 [Authorize] 标记的 Web API 方法进行 Ajax 调用,我只需将以下标头添加到我的 Ajax 调用中:

{ "Authorization": "Bearer " + window.authenticationToken }

response.access_token 来自哪里。你是从 C# 代码中设置的吗?
“响应”对象由“令牌”方法返回。
我没有研究角色。这种方法只是给你一个访问令牌,所以你可以调用用 [Authorize] 标签装饰的 WebApi 方法。据推测,当您调用任何这些方法时,您可以检查角色。 stackoverflow.com/questions/19689570/mvc-5-check-user-role 可能会有所帮助。
在这个解决方案中,您实际上在哪里验证您的用户?
/token 端点是为任何新的 Web API 项目自动创建的。这背后的代码是对用户进行身份验证的地方。如果您已将 Web API 控制器添加到现有 MVC 项目中,则情况会稍微复杂一些。