web-dev-qa-db-fra.com

RestSharp HttpBasicAuthentication - exemple

J'ai un client WPF utilisant RestSharp et le service API Web. J'essaie d'utiliser HttpBasicAuthenticator comme suit:

RestRequest login = new RestRequest("/api/users/login", Method.POST);
var authenticator = new HttpBasicAuthenticator("admin","22");
authenticator.Authenticate(Client, login);
IRestResponse response = Client.Execute(login); 

La demande POST ressemble à ceci:

POST http://localhost/api/users/login HTTP/1.1
Authorization: Basic YWRtaW46MjI=
Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml
User-Agent: RestSharp/105.1.0.0
Host: dellnote:810
Content-Length: 0
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
  1. Comment est-ce que je traite ce champ, Authorization: Basic YWRtaW46MjI= du côté du serveur? Dois-je obtenir un nom d'utilisateur et un mot de passe à partir de cet en-tête? 
  2. Comment renvoyer le jeton de sécurité du serveur au client et le sauvegarder côté client?

J'ai besoin d'une authentification simple basée sur un jeton de sécurité, mais je ne trouve pas d'exemple qui décrit tous les aspects de ce processus. Quelqu'un peut-il m'indiquer un exemple complet incluant les côtés client et serveur (et utilise RestSharp).

7
RomaS

new SimpleAuthenticator("username", username, "password", password) a PAS travaillé avec moi. 

Ce qui suit a cependant fonctionné:

var client = new RestClient("http://example.com");
client.Authenticator = new HttpBasicAuthenticator(userName, password);

var request = new RestRequest("resource", Method.GET);
client.Execute(request);
8
Gerhard Powell

De la documentation RestSharp:

var client = new RestClient("http://example.com");
client.Authenticator = new SimpleAuthenticator("username", "foo", "password", "bar");

var request = new RestRequest("resource", Method.GET);
client.Execute(request);

L'URL générée pour cette demande serait http://example.com/resource?username=foo&password=bar

Donc, vous obtenez le mot de passe comme n'importe quel autre paramètre (cependant, il est recommandé d'utiliser la méthode POST puis GET, pour des raisons de sécurité).

En ce qui concerne les cookies, vérifiez ceci: https://msdn.Microsoft.com/en-us/library/system.windows.application.setcookie.aspx

https://msdn.Microsoft.com/en-us/library/system.windows.application.getcookie.aspx

J'espère que ça aide

5
Felix Av

Vous pouvez également répondre à votre première question sur la récupération des valeurs d’en-tête d’authentification (côté serveur) depuis Comment puis-je récupérer les informations d’authentification de base de l’en-tête? :

private UserLogin GetUserLoginCredentials()
{
    HttpContext httpContext = HttpContext.Current;
    UserLogin userLogin;
    string authHeader = httpContext.Request.Headers["Authorization"];

    if (authHeader != null && authHeader.StartsWith("Basic"))
    {
        string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();
        Encoding encoding = Encoding.GetEncoding("iso-8859-1");
        string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword));
        int seperatorIndex = usernamePassword.IndexOf(':');

        userLogin = new UserLogin()
        {
            Username = usernamePassword.Substring(0, seperatorIndex),
            Password = usernamePassword.Substring(seperatorIndex + 1)
        };
    }
    else
    {
        //Handle what happens if that isn't the case
        throw new Exception("The authorization header is either empty or isn't Basic.");
    }
    return userLogin;
}

L'utilisation de cette méthode peut être:

UserLogin userLogin = GetUserLoginCredentials();

Regardez aussi: A-WebAPI-Basic-Authentication-Authorization-Filter

Réponse alternative à la deuxième question sur le renvoi du jeton (côté serveur):

var httpResponseMessage = Request.CreateResponse();

TokenResponse tokenResponse;
bool wasAbleToGetAccesToken = _identityServerHelper.TryGetAccessToken(userLogin.Username, userLogin.Password,
            platform, out tokenResponse);

httpResponseMessage.StatusCode = wasAbleToGetAccesToken ? HttpStatusCode.OK : HttpStatusCode.Unauthorized;
httpResponseMessage.Content = new StringContent(JsonConvert.SerializeObject(tokenResponse),
            System.Text.Encoding.UTF8, "application/json");

return httpResponseMessage;
1
Jacques Kammeyer