web-dev-qa-db-fra.com

Appel de l'API WEB avec authentification de base en C #

J'ai une API WEB fonctionnelle que j'ai écrite et j'ai ajouté une authentification de base à l'API (le nom d'utilisateur est "testing", le mot de passe est "123456"). Cependant, lorsque j'essaie d'appeler cette API à partir de mon formulaire Web, je reçois toujours le message "(401) Non autorisé". Que dois-je changer dans le code Web pour appeler l'API avec succès?

 string url = String.Format("http://example.com"); //here I have the correct url for my API
 HttpWebRequest requestObj = (HttpWebRequest)WebRequest.Create(url);
 requestObj.Method = "Get";
 requestObj.PreAuthenticate = true;
 requestObj.Credentials = new NetworkCredential("testing", "123456");
 HttpWebResponse responseObj = null;
 responseObj = (HttpWebResponse)requestObj.GetResponse();
 string strresult = null;
 using (Stream stream = responseObj.GetResponseStream())
 {
     StreamReader sr = new StreamReader(stream);
     strresult = sr.ReadToEnd();
     sr.Close();
 }

C'est ce que mon API recherche en termes d'authentification:

actionContext.Request.Headers.Authorization.Parameter

Dois-je ajouter un en-tête au lieu de NetworkCredential ou est-ce la même chose?

2
Maya Berk

(Authentification de base) Voici l'autre solution pour appeler l'API authentifiée

 class Program
{
    static void Main(string[] args)
    {
        BaseClient clientbase = new BaseClient("https://website.com/api/v2/", "username", "password");
        BaseResponse response = new BaseResponse();
        BaseResponse response = clientbase.GetCallV2Async("Candidate").Result;
    }


    public async Task<BaseResponse> GetCallAsync(string endpoint)
    {
        try
        {
            HttpResponseMessage response = await client.GetAsync(endpoint + "/").ConfigureAwait(false);
            if (response.IsSuccessStatusCode)
            {
                baseresponse.ResponseMessage = await response.Content.ReadAsStringAsync();
                baseresponse.StatusCode = (int)response.StatusCode;
            }
            else
            {
                baseresponse.ResponseMessage = await response.Content.ReadAsStringAsync();
                baseresponse.StatusCode = (int)response.StatusCode;
            }
            return baseresponse;
        }
        catch (Exception ex)
        {
            baseresponse.StatusCode = 0;
            baseresponse.ResponseMessage = (ex.Message ?? ex.InnerException.ToString());
        }
        return baseresponse;
    }
}


public class BaseResponse
{
    public int StatusCode { get; set; }
    public string ResponseMessage { get; set; }
}

public class BaseClient
{
    readonly HttpClient client;
    readonly BaseResponse baseresponse;

    public BaseClient(string baseAddress, string username, string password)
    {
        HttpClientHandler handler = new HttpClientHandler()
        {
            Proxy = new WebProxy("http://127.0.0.1:8888"),
            UseProxy = false,
        };

        client = new HttpClient(handler);
        client.BaseAddress = new Uri(baseAddress);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        var byteArray = Encoding.ASCII.GetBytes(username + ":" + password);

        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));

        baseresponse = new BaseResponse();

    }
}
0
Pramod Lawate

Je pense que votre API peut nécessiter l'ajout d'un en-tête (si vous ne l'avez pas déjà fait). Jetez un œil à cet article: https://en.wikipedia.org/wiki/Basic_access_authentication#Client_side

Mais essentiellement, votre API aura besoin d'un en-tête Authorization ajouté. La clé Authorization contiendra le mot Basic suivi d'un espace, puis le nom d'utilisateur et le mot de passe chiffrés à l'aide de Base64. Donc, dans votre cas, testing:123456 serait crypté en utilisant base64 comme dGVzdGluZzoxMjM0NTY=. Ainsi, l'enregistrement d'en-tête ressemblera à ceci:

Authorization: Basic dGVzdGluZzoxMjM0NTY=

0
David Grace