通过 C# 更新 JIRA 问题状态时面临“401:Unauthorized”问题

Facing '401:Unauthorized' issue when updating JIRA issue status through C#

我正在尝试使用 C# 代码更新 JIRA 中问题的状态。我找到了各种相同的curl代码,但由于我不熟悉curl,所以我将代码转换为C#。

现在,我面临的第一个错误是“状态代码:401”、“未经授权”。我正在使用电子邮件和 API 令牌进行授权。搜索并通读了所有 blogs/questions,发现了非常相似的问题,但无法找出我的代码的问题。

我也是 C# 和 Jira 环境的新手,如果你能帮我找出错误就太好了。或者如果我在代码中遗漏了什么?

查看下面的代码:

using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("PUT"), "https://<myhostname>.atlassian.net/rest/api/2/issue/<project>-<issueno>"))
{
var username = "<my-email>";
var password = "<API Token>";
var base64authorization = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}"));
request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}");

request.Content = new StringContent("{\"transition\":{\"id\":\"11\"}}");
request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

var response = await httpClient.SendAsync(request);
Console.WriteLine(response);
}
}

编辑: 将“Basic”替换为“Bearer”解决了 401 错误,但现在收到“400 Bad Request”错误。弄清楚这是因为我们传递了 JSON 来更新问题,所以在那里做了一些改变。现在我只是想更新问题的摘要。谁能帮我找到原因并解决问题?

using (var httpClient = new HttpClient())
            {
                using (var request = new HttpRequestMessage(new HttpMethod("PUT"), "https://<host-url>/rest/api/2/issue/<issue-key>"))
                {
                    var username = "<username>";
                    var password = "<API Key>";
                    string data = @"{'update' : {'summary' : [{'set' : 'Big block Chevy'}]}}";
                    var base64authorization = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}"));
                    request.Headers.TryAddWithoutValidation("Authorization", $"Bearer {base64authorization}");

                    request.Content = new StringContent($"{data}");
                    request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

                    var response = await httpClient.SendAsync(request);
                    Console.WriteLine(response);
                }
            }        

谢谢

巴哈纳

您正在使用 Encoding.ASCII.GetBytes 来获取字符串的字节表示,但您应该使用 Encoding.UTF8.GetBytes,因为这是 ToBase64String 所期望的。更改代码的那部分应该可以解决它。

我终于通过将代码更改为 Encoding.UTF8.GetBytes 解决了“401 Unauthorized”问题,但这并没有帮助我。在下一行中将“Basic”替换为“Bearer”确实帮助我解决了 401 错误。

request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}");

感谢您的帮助。