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
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? 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).
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);
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
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;