web-dev-qa-db-ja.com

C#で基本認証を使用してWEB APIを呼び出す

作成したWEB APIが機能しており、APIに基本認証を追加しました(ユーザー名は「testing」、パスワードは「123456」)。ただし、WebフォームからそのAPIを呼び出そうとすると、「(401)Unauthorized」メッセージが表示され続けます。 APIを正常に呼び出すには、Webコードで何を変更する必要がありますか?

 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();
 }

これは、認証に関して私のAPIが検索するものです。

actionContext.Request.Headers.Authorization.Parameter

NetworkCredentialの代わりにヘッダーを追加する必要がありますか、それとも同じですか?

2
Maya Berk

(基本認証)Authenticated APIを呼び出すための他のソリューション

 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

私はあなたのAPIがそれに追加されたヘッダーを必要とするかもしれないと思う(まだそうしていないなら)。この記事をご覧ください: https://en.wikipedia.org/wiki/Basic_access_authentication#Client_side

ただし、基本的に、APIにはAuthorizationヘッダーを追加する必要があります。 Authorizationキーには、Word Basicとそれに続くスペース、およびBase64を使用して暗号化されたユーザー名とパスワードが含まれます。したがって、インスタンスでは、testing:123456はbase64を使用してdGVzdGluZzoxMjM0NTY=として暗号化されます。したがって、ヘッダーレコードは次のようになります。

Authorization: Basic dGVzdGluZzoxMjM0NTY=

0
David Grace