User Authentication in ASP.NET Web API

前端 未结 3 541
醉话见心
醉话见心 2020-12-02 03:52

This topic has been incredibly confusing for me. I am a rookie in HTTP apps but need to develop an iPhone client that consumes JSON data from somewhere. I chose Web API from

相关标签:
3条回答
  • 2020-12-02 04:04

    I am amazed how I've not been able to find a clear example of how to authenticate an user right from the login screen down to using the Authorize attribute over my ApiController methods after several hours of Googling.

    That's because you are getting confused about these two concepts:

    • Authentication is the mechanism whereby systems may securely identify their users. Authentication systems provide an answers to the questions:

      • Who is the user?
      • Is the user really who he/she represents himself to be?
    • Authorization is the mechanism by which a system determines what level of access a particular authenticated user should have to secured resources controlled by the system. For example, a database management system might be designed so as to provide certain specified individuals with the ability to retrieve information from a database but not the ability to change data stored in the datbase, while giving other individuals the ability to change data. Authorization systems provide answers to the questions:

      • Is user X authorized to access resource R?
      • Is user X authorized to perform operation P?
      • Is user X authorized to perform operation P on resource R?

    The Authorize attribute in MVC is used to apply access rules, for example:

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

    The above rule will allow only users in the Admin and Super User roles to access the method

    These rules can also be set in the web.config file, using the location element. Example:

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

    However, before those authorization rules are executed, you have to be authenticated to the current web site.

    Even though these explain how to handle unauthorized requests, these do not demonstrate clearly something like a LoginController or something like that to ask for user credentials and validate them.

    From here, we could split the problem in two:

    • Authenticate users when consuming the Web API services within the same Web application

      This would be the simplest approach, because you would rely on the Authentication in ASP.Net

      This is a simple example:

      Web.config

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

      Users will be redirected to the account/login route, there you would render custom controls to ask for user credentials and then you would set the authentication cookie using:

          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);
      
    • Cross - platform authentication

      This case would be when you are only exposing Web API services within the Web application therefore, you would have another client consuming the services, the client could be another Web application or any .Net application (Win Forms, WPF, console, Windows service, etc)

      For example assume that you will be consuming the Web API service from another web application on the same network domain (within an intranet), in this case you could rely on the Windows authentication provided by ASP.Net.

      <authentication mode="Windows" />
      

      If your services are exposed on the Internet, then you would need to pass the authenticated tokens to each Web API service.

      For more info, take a loot to the following articles:

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

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

    0 讨论(0)
  • 2020-12-02 04:05

    If you want to authenticate against a user name and password and without an authorization cookie, the MVC4 Authorize attribute won't work out of the box. However, you can add the following helper method to your controller to accept basic authentication headers. Call it from the beginning of your controller's methods.

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

    From the client side, this helper creates a HttpClient with the authentication header in place:

    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;
    }
    
    0 讨论(0)
  • 2020-12-02 04:05

    I am working on a MVC5/Web API project and needed to be able to get authorization for the Web Api methods. When my index view is first loaded I make a call to the 'token' Web API method which I believe is created automatically.

    The client side code (CoffeeScript) to get the token is:

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

    If successful the following is called, which saves the authentication token locally:

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

    Then if I need to make an Ajax call to a Web API method that has the [Authorize] tag I simply add the following header to my Ajax call:

    { "Authorization": "Bearer " + window.authenticationToken }
    
    0 讨论(0)
提交回复
热议问题