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:
- Jeśli nie to jak naprawić atrybut
[Authorize]
, aby odczytać token? - Jak wygenerować ten token? Chyba nie mogę używać formsauthentication bo to używa ciasteczek.
- 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?
- 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.
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
- klient żąda bezpiecznych danych Klient nie jest autoryzowany, zwraca odpowiedź z nieautoryzowanym kodem statusu]} Klient wysyła poświadczenia do uwierzytelnienia, które powinny być zabezpieczone przez HTTPS
- po zatwierdzeniu klient otrzymuje token poprzez nagłówek HTTP lub cokolwiek działa dla ciebie
- Klient ponownie próbuje zażądać bezpiecznych danych, tym razem dołączając token do żądania
- AuthorizeTokenAttribute potwierdzi token i pozwoli na wykonanie akcji.
Również, sprawdź ten post przez John Petersen. Making your ASP.NET Web API ' s secure
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.
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).]}
- przechowuj taki profil dostępu w bazie danych
- 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!!!
- serwer pobiera żądanie sprawdzi dostęp i podpis przy użyciu tego samego algorytmu obliczeniowego w celu odrzucenia lub przyznania dostępu (uwierzytelnienia)
- 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.
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
}
}
} }
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