Uwierzytelnianie wieloplatformowe przy użyciu ASP.NET Web API

Jak zacząć kodowanie uwierzytelniania za pomocą ASP.NET Web API więc jest cross-platform do obsługi komputerów stacjonarnych, mobilnych i internetowych? Czytałem o niektórych metodach uwierzytelniania RESTful, takich jak używanie tokenów w nagłówku.

Czy są jakieś przykładowe projekty, które wykorzystują tę metodę?

Pytania:

  1. Jeśli nie to jak naprawić atrybut [Authorize], aby odczytać token?
  2. Jak wygenerować ten token? Chyba nie mogę używać formsauthentication bo to używa ciasteczek.
  3. jak poradzić sobie z rzeczywistą autoryzacją, czy klient wysyła surowe hasło i nazwę Użytkownika, a następnie generuję token, czy jest jakiś inny sposób?
  4. Jak sobie z tym poradzić, gdy moja strona korzysta z niego? Słyszałem, że jest to obsługiwane inaczej niż wtedy, gdy aplikacja go używa, takie jak uzyskanie domeny i autoryzowanie jej.
Author: Shawn Mclean, 2012-03-27

4 answers

/ Align = "left" / Uwierzytelnianie formularzy opiera się na plikach cookie dla sieci. Nie jest to jednak najbardziej pomysłowa sytuacja dla wszystkich klientów spoza przeglądarki.

Sugerowałbym utworzenie niestandardowego AuthorizationFilterAttribute i nadpisanie metody Onautoryzacji. W tej metodzie możesz sprawdzić istnienie tokena, który wydałeś klientowi po dostarczeniu ważnych poświadczeń. Możesz użyć tego atrybutu w dowolnej metodzie lub kontrolerze potwierdzony. Oto przykład, do którego możesz się odwołać

 public class AuthorizeTokenAttribute : AuthorizationFilterAttribute 
{      
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext != null)
        {                
                if (!AuthorizeRequest(actionContext.ControllerContext.Request))
                {
                    actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) { RequestMessage = actionContext.ControllerContext.Request }; 
                }
                return;
        }
    }

    private bool AuthorizeRequest(System.Net.Http.HttpRequestMessage request)
    {
        bool authorized = false;
        if (request.Headers.Contains(Constants.TOKEN_HEADER))
        {               
            var tokenValue = request.Headers.GetValues("TOKEN_HEADER");
            if (tokenValue.Count() == 1) {
                var value = tokenValue.FirstOrDefault();               
               //Token validation logic here
               //set authorized variable accordingly
            }                
        }
        return authorized;
    } }

TOKEN_HEADER jest tylko ciągiem znaków reprezentującym nagłówek HTTP, który klient powinien przekazać z powrotem dla uwierzytelnionych żądań.

Więc przejdźmy przez to

  1. klient żąda bezpiecznych danych
  2. Klient nie jest autoryzowany, zwraca odpowiedź z nieautoryzowanym kodem statusu]} Klient wysyła poświadczenia do uwierzytelnienia, które powinny być zabezpieczone przez HTTPS
  3. po zatwierdzeniu klient otrzymuje token poprzez nagłówek HTTP lub cokolwiek działa dla ciebie
  4. Klient ponownie próbuje zażądać bezpiecznych danych, tym razem dołączając token do żądania
  5. AuthorizeTokenAttribute potwierdzi token i pozwoli na wykonanie akcji.

Również, sprawdź ten post przez John Petersen. Making your ASP.NET Web API ' s secure

 42
Author: cecilphillip,
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-11-13 14:51:30

Istnieje wiele sposobów uwierzytelniania użytkowników w usłudze REST. Korzystanie z tokenów jest możliwe, ale samo korzystanie z podstawowego uwierzytelniania jest jeszcze prostsze i mniej więcej tak standardowe i wieloplatformowe, jak można przejść.

Nie myl autoryzacji z autoryzacją . Atrybut [Authorize] dotyczy tylko autoryzacji, ale tylko po uwierzytelnieniu użytkownika za pomocą innego mechanizmu. Autoryzacja jest całkowicie bezużyteczna bez odpowiedniego uwierzytelniania najpierw.

Najlepszym zasobem do sprawdzenia jest Dominick Baier , który jest ekspertem w tym temacie.

 21
Author: Maurice,
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
2012-07-19 19:09:59

Stosuję bardzo proste podejście:

    W tym celu należy utworzyć profil accessid i accessKey (np. MD5 hashed GUID value).]}
  1. przechowuj taki profil dostępu w bazie danych
  2. każde żądanie (GET / POST / etc.) musi dostarczyć accessId, queryHash (MD5 hash value reprezentuje zapytanie) i signature (MD5 hash value of queryHash + accessKey). Oczywiście klient musi zachować accessKey w bezpiecznym miejscu!!!
  3. serwer pobiera żądanie sprawdzi dostęp i podpis przy użyciu tego samego algorytmu obliczeniowego w celu odrzucenia lub przyznania dostępu (uwierzytelnienia)
  4. dalsza autoryzacja może być wykonywana na podstawie typu żądania przy użyciu profilu dostępu

Usługa z takim podejściem przy użyciu nowego ASP.NET MVC web API może obsługiwać dowolny typ klienta: przeglądarka / javascript i natywny (stacjonarny lub mobilny) itp.

 2
Author: user1344426,
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
2012-04-19 15:30:54

U można użyć ActionFilterAttribute i nadpisać metodę OnActionExecuting. Później zarejestruj ten filtr w global.cs, aby zastosować ten filtr dla wszystkich akcji takich jak ta w metodzie Application Start

Var config = GlobalConfiguration.Konfiguracja; config.Filtry.Add (new CustomAuthAttribute ());

{ namespace Customss { Public class CustomAuthAttribute : ActionFilterAttribute

{

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        // To inforce HTTPS if desired , else comment out the code
        if (!String.Equals(actionContext.Request.RequestUri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
            {
                Content = new StringContent("HTTPS Required")
            };
            return;
        }

       // get toekn from the header

        var userToken = actionContext.Request.Headers.GetValues("UserToken");
         // Customer Logic to check the validity of the token.
        // U can have some DB logic to check , custom STS behind or some loca cache used to compare the values


    }


}

} }

 0
Author: Mian,
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-07-05 12:47:22