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

这个话题对我来说令人难以置信的困惑。 我是HTTP应用程序的新手,但需要开发一个iPhone客户端,从某处使用JSON数据。 我从MS选择了Web API,因为它看起来很简单,但当涉及到认证用户时,事情变得非常令人沮丧。

我很惊讶,我几个小时的谷歌搜索后,无法找到一个明确的例子来说明如何从登录界面到使用我的ApiController方法的Authorize属性来验证用户权限。

这不是一个问题,而是一个要求如何完全做到这一点的例子。 我看过以下几页:

  • 使您的ASP.NET Web API的安全
  • 使用ASP.NET Web API进行基本身份验证
  • 尽管这些解释了如何处理未经授权的请求,但它们并没有清楚地表明像LoginController或类似的东西来请求用户凭证并验证它们。

    任何人愿意写一个很好的简单的例子或指向正确的方向,请吗?

    谢谢。


    我很惊讶,我几个小时的谷歌搜索后,无法找到一个明确的例子来说明如何从登录界面到使用我的ApiController方法的Authorize属性来验证用户权限。

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

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

  • 谁是用户?
  • 用户真的代表他自己是谁吗?
  • 授权是系统确定特定认证用户对系统控制的资源进行安全保护的程度的机制。 例如,可以设计数据库管理系统,以便为某些指定的个人提供从数据库检索信息的能力,但不能改变存储在数据库中的数据,同时给予其他个人更改数据的能力。 授权系统为这些问题提供了答案:

  • 用户X是否有权访问资源R?
  • 用户X是否被授权执行操作P?
  • 用户X是否有权对资源R执行操作P?
  • MVC中的Authorize属性用于应用访问规则,例如:

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

    上述规则将只允许Admin和Super User角色的用户访问该方法

    这些规则也可以使用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文件

    <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://codebetter.com/johnvpetersen/2012/04/02/making-your-asp-net-web-apis-secure/


  • 如果您想要根据用户名和密码进行身份验证并且没有授权cookie ,则MVC4授权属性将无法使用。 但是,您可以将以下帮助程序方法添加到您的控制器以接受基本身份验证标头。 从控制器方法的开始调用它。

    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;
    }
    

    我正在开发一个MVC5 / 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 }
    
    链接地址: http://www.djcxy.com/p/3463.html

    上一篇: User Authentication in ASP.NET Web API

    下一篇: Using WebAPI or MVC to return JSON in ASP.NET