Почему мой веб-API возвращает код состояния 401, когда я использую класс WebClient, и код состояния 200, когда я использую HttpWebResponse? - PullRequest
0 голосов
/ 04 марта 2020

Так что я довольно новичок в этом слове, поэтому извините, если я что-то упустил.

Я написал Web Api в Asp. Net .Core 2.2, который использует токен jwt для authorizazion. Мой метод проверки подлинности выглядит следующим образом:

    [AllowAnonymous]
    [HttpGet("auth")]
    public ActionResult<SecurityToken> Auth([FromHeader] string identity)
    {
        // authentication successful so generate jwt token
        //if (HwKeyManager.MASTER_KEY.KEY_NOT_PRESENT)
        //{
        //    //hasLicense = HwKeyManager.product_license_get();
        //}
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes(someKey);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new Claim[]
            {
                new Claim(ClaimTypes.Name, identity)
            }),
            Expires = DateTime.Now.AddMinutes(10),
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        };
        try
        {
            SecurityToken token = tokenHandler.CreateToken(tokenDescriptor);
            string returnToken = tokenHandler.WriteToken(token);
            return Ok(returnToken);
        }
        catch(Exception ex)
        {
            logger.Error("Error while creating token : " + ex.Message);
            return StatusCode(500);
        }
    }

это работает и дает мне токен, который я успешно использовал в запросе, подобном следующему:

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + "status");
 request.Timeout = 15000;
 request.Headers.Add("Authorization", "Bearer " + token);
 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
 {
    if (response.StatusCode == HttpStatusCode.OK)
    {
       return true;
    }
    else
    {
       return false;
    }

 }

Однако для другого метода я был пытаюсь использовать класс WebClient для создания POST-запроса, но я не могу заставить работать следующий фрагмент кода (я получаю код состояния 401, Unauthorized)

WebClient wcl = new WebClient();
wcl.Headers.Add(HttpRequestHeader.ContentType, "application/json");
wcl.Headers.Add("Authorization", "Bearer" + token);
wcl.Encoding = System.Text.Encoding.UTF8;
string pippo = wcl.UploadString(url + "doSomething", "POST", Data.ToJson());

, если я переключаюсь на HttpWebResponse, однако все работает

byte[] bytes = Encoding.ASCII.GetBytes(Data.ToJson());
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + "doSomething");
request.Timeout = 15000;
request.Headers.Add("Authorization", "Bearer " + token);
request.Method = "POST";
request.ContentType = "application/json";
Stream dataStream = request.GetRequestStream();
dataStream.Write(bytes, 0, bytes.Length);
dataStream.Close();
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    if (response.StatusCode == HttpStatusCode.OK)
    {

    }
    else
    {

    }

}

Может кто-нибудь объяснить мне, почему это происходит, и если есть способ решить это?

1 Ответ

2 голосов
/ 04 марта 2020

Вы забыли пробел между носителями.

wcl.Headers.Add("Authorization", "Bearer" + token);

Так что просто измените его на

wcl.Headers.Add("Authorization", "Bearer " + token);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...