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

2024-01-10

我需要开发一个 iPhone 客户端来使用来自某处的 JSON 数据。我选择了 MS 的 Web API,因为它看起来很简单,但在验证用户身份时,事情变得非常令人沮丧。

我很惊讶我无法找到一个清晰的示例来说明如何从登录屏幕到使用Authorize属性超过我的ApiController经过几个小时的谷歌搜索后的方法。

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

  • 确保 ASP.NET Web API 的安全 http://codebetter.com/johnvpetersen/2012/04/02/making-your-asp-net-web-apis-secure/
  • 使用 ASP.NET Web API 进行基本身份验证 http://stevescodingblog.co.uk/basic-authentication-with-asp-net-webapi/

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

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


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

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

  • 身份验证是系统可以安全地识别其用户的机制。身份验证系统提供了以下问题的答案:

    • 用户是谁?
    • 用户真的是他/她所代表的那个人吗?
  • 授权是一种机制,系统通过该机制确定特定的经过身份验证的用户对系统控制的安全资源应具有何种级别的访问权限。例如,数据库管理系统可能被设计为向某些特定个人提供从数据库检索信息的能力,但不提供更改数据库中存储的数据的能力,同时向其他个人提供更改数据的能力。授权系统提供以下问题的答案:

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

The AuthorizeMVC中的属性用于应用访问规则,例如:

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

上述规则仅允许用户在Admin and 超级用户访问该方法的角色

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

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

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

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

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

  • 在同一 Web 应用程序中使用 Web API 服务时对用户进行身份验证

    这将是最简单的方法,因为您将依赖于ASP.Net 中的身份验证 http://msdn.microsoft.com/en-us/library/eeyk640h.aspx

    这是一个简单的例子:

    网页配置

      <authentication mode="Forms">
        <forms
          protection="All"
          slidingExpiration="true"
          loginUrl="account/login"
          cookieless="UseCookies"
          enableCrossAppRedirects="false"
          name="cookieName"
        />
      </authentication>
    

    用户将被重定向到帐号登录路由,您将在那里呈现自定义控件来询问用户凭据,然后您将使用以下命令设置身份验证 cookie:

          if (ModelState.IsValid)
          {
              if (Membership.ValidateUser(model.UserName, model.Password))
              {
                  FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                  return RedirectToAction("Index", "Home");
              }
              else
              {
                  ModelState.AddModelError("", "The user name or password provided is incorrect.");
              }
          }
    
          // If we got this far, something failed, redisplay form
          return View(model);
    
  • 跨平台认证

    这种情况是当你仅在 Web 应用程序中公开 Web API 服务因此,您将有另一个客户端使用这些服务,该客户端可以是另一个 Web 应用程序或任何 .Net 应用程序(Win Forms、WPF、控制台、Windows 服务等)

    例如,假设您将从同一网络域(Int​​ranet 内)上的另一个 Web 应用程序使用 Web API 服务,在这种情况下,您可以依赖 ASP.Net 提供的 Windows 身份验证。

      <authentication mode="Windows" />
    

    如果您的服务暴露在 Internet 上,那么您需要将经过身份验证的令牌传递给每个 Web API 服务。

    欲了解更多信息,请阅读以下文章:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET Web API 中的用户身份验证 的相关文章

随机推荐