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

yi0zb3m4  于 2022-12-27  发布在  .NET
关注(0)|答案(3)|浏览(243)

我需要开发一个iPhone客户端,它可以从某个地方使用JSON数据。我选择了MS的Web API,因为它看起来很容易,但当涉及到用户身份验证时,事情变得相当令人沮丧。
我很惊讶,在谷歌上搜索了几个小时后,我竟然找不到一个清晰的示例,说明如何从登录屏幕到在我的ApiController方法上使用Authorize属性来验证用户。
这不是一个问题,而是要求提供一个如何准确做到这一点的例子。我已经看了以下几页:

尽管这些说明了如何处理未授权请求,但它们并没有清楚地演示LoginController之类的请求用户凭据并验证它们的方法。
有人愿意写一个简单的例子或者给我指出正确的方向吗?

dw1jzc5e

dw1jzc5e1#

我很惊讶,在谷歌上搜索了几个小时后,我竟然找不到一个清晰的例子,说明如何从登录屏幕到使用ApiController方法上的Authorize属性来验证用户。
这是因为你对这两个概念感到困惑:

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

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

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

上述规则仅允许用户(具有 AdminSuper User 角色)访问方法
也可以在web.config文件中使用location元素设置这些规则。

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

但是,在执行这些授权规则之前,您必须通过当前网站的身份验证
尽管这些说明了如何处理未经授权的请求,但它们并没有清楚地演示类似LoginController或类似的东西来请求用户凭据并验证它们。
从这里,我们可以将问题一分为二:

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

这是最简单的方法,因为您将依赖于Authentication in ASP.Net
这是一个简单的例子:

Web配置

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

用户将被重定向到 account/login 路径,在那里您将呈现自定义控件以询问用户凭据,然后您将使用以下命令设置身份验证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服务等)
例如,假设您将使用同一网络域(内部网内)上的另一个Web应用程序的Web API服务,在这种情况下,您可以依赖ASP.NET提供的Windows身份验证。

<authentication mode="Windows" />

如果您的服务在Internet上公开,则需要将经过身份验证的令牌传递给每个Web API服务。
欲了解更多信息,请访问以下文章:

brgchamk

brgchamk2#

如果你想验证用户名和密码而不使用授权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"));
}

从客户端,这个helper创建一个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;
}
kq0g1dla

kq0g1dla3#

我正在处理一个MVC 5/Web API项目,需要能够获得Web API方法的授权。当我的索引视图第一次加载时,我调用了“token”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 }

相关问题