ASP.net Web API RESTful web service + podstawowe uwierzytelnianie

Wdrażam RESTful web service używając ASP.Net Web Api. Doszedłem do wniosku, że do wykonania części uwierzytelniania użyłem podstawowego uwierzytelniania + SSL. Jaki jest najlepszy / poprawny sposób realizacji tego?

Moją pierwszą próbą było zrobienie tego ręcznie, parsowanie nagłówka autoryzacji, dekodowanie i weryfikowanie użytkownika w bazie danych. To działa, ale zastanawiam się, czy czegoś nie przeoczyłem.

Widziałem kilka rozwiązań wykorzystujących role i zasady użytkowników. Chociaż nie jestem pewien, co to właściwie do, jestem prawie pewien, że nie będę ich potrzebował, ponieważ w mojej bazie danych definiuję własnych użytkowników i ich role.

Również to, czego jeszcze nie do końca rozumiem, jest to, czy konsumenci usługi muszą wysyłać poświadczenia z każdym żądaniem lub są w jakiś sposób buforowane. Czy mój serwis powinien coś zrobić, aby tak się stało, czy poradzi sobie z tym całkowicie konsument?

I ostatnie pytanie o klientów składających zapytania za pomocą javascript. Czy byłoby jakieś " cross domain Prośba " problemy w przypadku próby skorzystania z usługi?

Author: Darrel Miller, 2013-06-15

3 answers

Jamie Kurtze zapewnia dobre wyjaśnienie korzystania z podstawowego uwierzytelniania tutaj ASP.NET Web API REST Security Basics

Z mojego zrozumienia, jeśli chcesz, aby Twoje żądania były bezpaństwowe, każde żądanie będzie wymagało ustawienia pola uwierzytelniania

Jamie Kurtze owija wymagany kod w klasie pochodzącej z DelegateHandler, podczas gdy Rick Strahl sprawdza, czy wywołanie jest poprawne za pomocą filtra. Możesz przeczytać więcej na jego blogu na ten temat w a WebAPI Basic Authentication Authorization Filter

 29
Author: 2D1C,
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
2016-01-26 16:12:32

Użyj podstawowego uwierzytelniania dla początkowego (Zaloguj się) żądania poprzez dodanie atrybutu [BasicHttpAuthorize] do odpowiednich kontrolerów/metod. W razie potrzeby określ role Users i z atrybutem. Zdefiniuj BasicHttpAuthorizeAttribute jako wyspecjalizowane AuthorizeAttribute Tak:

public class BasicHttpAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        if (Thread.CurrentPrincipal.Identity.Name.Length == 0) { // If an identity has not already been established by other means:
            AuthenticationHeaderValue auth = actionContext.Request.Headers.Authorization;
            if (string.Compare(auth.Scheme, "Basic", StringComparison.OrdinalIgnoreCase) == 0) {
                string credentials = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(auth.Parameter));
                int separatorIndex = credentials.IndexOf(':');
                if (separatorIndex >= 0) {
                    string userName = credentials.Substring(0, separatorIndex);
                    string password = credentials.Substring(separatorIndex + 1);
                    if (Membership.ValidateUser(userName, password))
                        Thread.CurrentPrincipal = actionContext.ControllerContext.RequestContext.Principal = new GenericPrincipal(new GenericIdentity(userName, "Basic"), System.Web.Security.Roles.Provider.GetRolesForUser(userName));
                }
            }
        }
        return base.IsAuthorized(actionContext);
    }
}

Niech początkowa odpowiedź zawiera klucz API dla użytkownika. Użyj klucza API do kolejnych wywołań. W ten sposób uwierzytelnianie klienta pozostaje ważne, nawet jeśli użytkownik zmieni nazwę użytkownika lub hasło. Jednak przy zmianie hasła daj użytkownikowi opcję "Rozłącz klientów", którą zaimplementujesz usuwając klucz API na serwerze.

 23
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-11-02 20:30:56
 1
Author: leastprivilege,
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-06-16 13:10:58