Uwierzytelnianie użytkowników w ASP.NET Web API

Ten temat był dla mnie niesamowicie zagmatwany. Jestem nowicjuszem w aplikacjach HTTP, ale muszę opracować klienta iPhone ' a, który zużywa skądś dane JSON. Wybrałem Web API od MS, ponieważ wydawało się wystarczająco łatwe, ale jeśli chodzi o uwierzytelnianie użytkowników, rzeczy stają się dość frustrujące.

Jestem zdumiony, jak nie udało mi się znaleźć jasnego przykładu, jak uwierzytelnić użytkownika od ekranu logowania do używania atrybutu Authorize w moich metodach ApiController po kilku godzinach Googlowanie.

To nie jest pytanie, ale Prośba o przykład, jak dokładnie to zrobić. Zajrzałem na następujące strony:

Mimo że wyjaśniają one, jak obsługiwać nieautoryzowane żądania, nie pokazują wyraźnie czegoś w rodzaju LoginController lub czegoś takiego, aby poprosić o poświadczenia użytkownika i je zweryfikować.

Ktokolwiek chcesz napisać prosty przykład lub wskazać mi właściwy kierunek?

Dzięki.
Author: chridam, 2012-07-31

3 answers

Jestem zdumiony, jak nie udało mi się znaleźć jasnego przykładu, jak uwierzytelnić użytkownika od ekranu logowania aż do użycia atrybutu Authorize w moich metodach ApiController po kilku godzinach googlowania.

To dlatego, że zaczynasz się mylić z tymi dwoma pojęciami:

  • Uwierzytelnianie jest mechanizmem, dzięki któremu systemy mogą bezpiecznie identyfikować swoich użytkowników. Systemy uwierzytelniania dostarczają odpowiedzi na pytania:

    • kim jest użytkownik?
    • czy użytkownik naprawdę jest tym, za kogo się przedstawia?
  • Autoryzacja jest mechanizmem, za pomocą którego system określa, jaki poziom dostępu powinien mieć dany uwierzytelniony użytkownik, aby zabezpieczyć zasoby kontrolowane przez system. Na przykład system zarządzania Bazą Danych może być zaprojektowany tak, aby zapewnić określonym osobom możliwość pobierania informacji z bazy danych, ale nie możliwość zmiany danych przechowywanych w bazie danych, jednocześnie dając innym osobom możliwość zmiany danych. Systemy autoryzacji dostarczają odpowiedzi na pytania:

    • czy użytkownik X jest upoważniony do dostępu do zasobu R?
    • czy użytkownik X jest upoważniony do wykonania operacji P?
    • czy użytkownik X jest upoważniony do wykonania operacji P na zasobie R?

Atrybut Authorize W MVC jest używany do stosowania reguł dostępu, na przykład:

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

Powyższa reguła pozwoli tylko użytkownicy w rolach Admin i Super User, aby uzyskać dostęp do metody

Reguły te można również ustawić w sieci.plik konfiguracyjny, używając elementu location. Przykład:

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

Jednak, zanim te reguły autoryzacji zostaną wykonane, musisz być uwierzytelniony na bieżącej stronie internetowej .

Chociaż wyjaśniają one, jak obsługiwać nieautoryzowane żądania, nie pokazują wyraźnie czegoś takiego jak LoginController lub coś takiego, aby poprosić o poświadczenia użytkownika i je zweryfikować.

Stąd możemy podzielić problem na dwie części:

  • Uwierzytelnianie użytkowników podczas korzystania z usług Web API w ramach tej samej aplikacji internetowej

    Byłoby to najprostsze podejście, ponieważ polegałbyś na uwierzytelnianiu w ASP.Net

    Oto prosty przykład:

    Www.config

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

    Użytkownicy zostaną przekierowani na konto / login route, tam można renderować niestandardowe kontrolki, aby poprosić o poświadczenia użytkownika, a następnie ustawić plik cookie uwierzytelniania za pomocą:

        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);
    
  • Uwierzytelnianie wieloplatformowe

    Tak będzie, gdyujawniasz tylko usługi Web API w aplikacji webowej dlatego masz innego klienta korzystającego z usług, klientem może być inna aplikacja webowa lub dowolna aplikacja. Net (Win Forms, WPF, console, usługa Windows, etc)

    Załóżmy na przykład, że będziesz korzystać z usługi Web API z innej aplikacji internetowej w tej samej domenie sieciowej (w ramach intranetu), w tym przypadku możesz polegać na uwierzytelnianiu Windows zapewnianym przez ASP.Net.

    <authentication mode="Windows" />
    

    Jeśli Twoje usługi są widoczne w Internecie, musisz przekazać uwierzytelnione tokeny do każdej usługi Web API.

    Aby uzyskać więcej informacji, weź łup do następujących artykuły:

 175
Author: Jupaol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-01 14:11:21

Jeśli chcesz uwierzytelnić się za pomocą nazwa użytkownika i hasło i Bez pliku cookie autoryzacji, atrybut MVC4 Authorize nie będzie działać po wyjęciu z pudełka. Możesz jednak dodać następującą metodę pomocniczą do kontrolera, aby zaakceptować podstawowe nagłówki uwierzytelniania. Wywołaj to od początku metod kontrolera.

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

Po stronie klienta, ten Pomocnik tworzy HttpClient z nagłówkiem uwierzytelniania w miejscu:

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;
}
 14
Author: Edward Brey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-13 02:45:37

Pracuję nad projektem MVC5 / Web API i musiałem uzyskać autoryzację dla metod Web Api. Kiedy mój widok indeksu jest ładowany po raz pierwszy wykonuję połączenie z metodą "token" Web API, która moim zdaniem jest tworzona automatycznie.

Kod po stronie klienta (CoffeeScript), aby uzyskać token, to:

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

Jeśli się powiedzie, zostanie wywołane następujące polecenie, które zapisze token uwierzytelniania lokalnie:

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

Następnie, jeśli muszę wykonać wywołanie Ajax do metody Web API, która ma [Authorize] tag dodaję po prostu następujący nagłówek do mojego wywołania Ajax:

{ "Authorization": "Bearer " + window.authenticationToken }
 9
Author: ProfNimrod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-16 16:36:10