我正在使用C#向Azure event hub发送数据。与Eventhub客户端不同,数据将通过http发布。根据需求,我创建了一个嵌入到http头中的SAStoken。但是当我发帖的时候得到501,未经授权的访问错误。不知道我哪里出了问题。下面是我写的代码
public static async Task<HttpResponseMessage> SendDataUsingHttp()
{
// Namespace info.
var serviceNamespace = "myeventhubs";
var hubName = "eventhub1";
var url = string.Format("{0}/publishers/{1}/messages", hubName, 1);
//var url = string.Format("{0}/messages", hubName);
var baseUri = new
Uri(string.Format("https://{0}.servicebus.windows.net/"
, serviceNamespace));
var SharedAccessKeyName = "All";
var SharedAccessKey = "<shared access key>";
var sasToken =
createSasToken(baseUri.ToString(),SharedAccessKeyName,
SharedAccessKey);
var evtData = new
{
Temperature = new Random().Next(20, 50)
};
var payload = JsonConvert.SerializeObject(evtData);
// Create client.
var httpClient = new HttpClient
{
BaseAddress = baseUri
};
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Authorization = new
System.Net.Http.Headers.AuthenticationHeaderValue
("SharedAccessSignature", sasToken);
var content = new StringContent(payload, Encoding.UTF8);
content.Headers.ContentType = new
System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
HttpResponseMessage result = null;
try
{
result = await httpClient.PostAsync(url, content);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
return result;
}
private static string createSasToken(string baseUri, string keyName,
string key)
{
TimeSpan sinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1);
var week = 60 * 60 * 24 * 7;
var expiration = Convert.ToString((int)sinceEpoch.TotalSeconds +
week);
string stringToSign = HttpUtility.UrlEncode(baseUri) + "\n" +
expiration;
HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key)); //--
var signature =
Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(
stringToSign)));
var sasToken = String.Format(CultureInfo.InvariantCulture,
"SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",
HttpUtility.UrlEncode(baseUri), HttpUtility.UrlEncode(signature),
expiration, keyName);
return sasToken;
}
{statuscode:401,reasonprace:'unauthorization',version:1.1,content:system.net.http.streamcontent,标头:{transfer-encoding:chunked strict-transport-security:microsoft-httpapi/2.0日期:Sun,2018年6月17日08:35:43 GMT server:microsoft-httpapi/2.0内容-类型:application/xml;charset=UTF-8
}}内容:{system.net.http.streamcontent}标头:{transfer-encoding:chunked
根据createSastoken
方法,它将生成具有以下格式的授权标头值:
Authorization: SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}
对于请求,还可以指定以下代码:
System.Net.Http.Headers.AuthenticationHeaderValue("SharedAccessSignature", sasToken);
使用Fiddler捕获网络跟踪,您会发现发送的请求中的授权头值如下所示:
Authorization: SharedAccessSignature SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}
对于您的代码,您需要在createsastoken
方法下调整sastoken
的格式。
此外,createsastoken
方法的baseURI
参数需要是您请求的完整请求路径。因此,您需要修改SendDatausInghttp
下的相关代码以生成令牌,如下所示:
var sasToken =createSasToken(baseUri+url, SharedAccessKeyName, SharedAccessKey);
我的数据未发布在postman api中,这会导致以下错误: 单调的节奏。我的主人。com/api/领域:1个职位http://dradiobeats.x10host.com/api/areas401(未授权)核心。js:4002错误HttpErrorResponse 我的app.component.ts 如何解决此错误?
问题内容: 我从Nexus存储库中检出了代码。我更改了帐户密码,并在文件中正确设置了密码。在执行时,我收到错误消息,说明它尝试从该存储库下载文件。 任何想法如何解决此错误?我在Maven 3.04中使用Windows 7 问题答案: 这里的问题是所使用的密码出现错字错误,由于密码中使用了字符/字母,因此很难识别。
我在这里遵循 JWT 夸克指南。我想在不允许用户组访问 API 时发送自定义响应。 这是指南中显示的示例。 我如何知道请求是否未经授权,以便我可以发送自定义响应。
我试图使用Azure发布管道在一个解决方案中发布多个项目 它们都连接到同一Azure订阅,但有些确实部署到给定的应用程序服务,而另一些则给出未经授权的错误。 我已经研究过了,我读到添加website_webdeploy_use_scm到应用程序服务应该有助于未经授权的错误,但这对我没有帮助。 我还能看什么?我通过Azure Devops连接,所以我只是从它自动从Azure收集的列表中选择订阅,因为
null null
有两个ASP.NET核心Web API使用承载令牌身份验证。这些服务还提供静态文件,这些文件用于同意API进入消费应用程序的目录。所以这两个API都在Azure AD中启用了隐式流。 API2使用jwt-barer授权从Web API控制器调用API1。API2具有访问API1的权限。 来自第三个目录的用户导航到API2服务的SPA。用户被重定向到Azure AD,登录并同意API。用户被重定向回