如何从发送到 ASP.NET 核心 2.0 API 控制器操作的请求中获取身份验证 header
How to get the authentication header from a request sent to an ASP.NET core 2.0 API controller action
我正在开发 ASP.NET Core 2.0 RESTful API。我有一个场景,我需要使用 HTTPGet 方法在我的 API 控制器上调用一个操作,并且我需要提取将用于调用另一个第 3 方 API 的用户名和密码值。用户名和密码与当前登录的用户身份无关,它们只是我想从我自己的 API 发送给另一个 API 的值,但我不想只传递它们查询字符串。
我可以在客户端使用基本身份验证将用户名和密码添加到 HttpRequestMessage 身份验证 header,然后在我的 ASP.NET Core 2.0 [=39= 中提取 header ] 控制器动作?
我的客户在调用 API
的代码中会有类似这样的内容
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, relativeUrl);
var byteArray = new UTF8Encoding().GetBytes(string.Format($"username:password"));
request.Headers.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
而且,我的 API 控制器动作会像这样开始;
[HttpGet()]
public IActionResult GetUploadedFileList([FromQuery]int pageNumber, [FromQuery]int pageSize)
{
//Extract Authentication header values for username and password
}
任何人都可以提供如何从 HTTPGet 请求
中获取授权的示例 header
我知道我可以使用 HTTPPost [FromBody] 轻松做到这一点,但我的用例要求此方法是 HTTGet。
在此先感谢您的帮助。
编辑 1 - 解决方案
由于 this link 的一些提示,我能够使下面的代码正常工作。虽然这看起来工作量很大,所以如果有人有更好或更清晰的解决方案,请 post 你的例子。
[HttpGet()]
public IActionResult GetUploadedFiles([FromQuery]int pageNumber, [FromQuery]int pageSize)
{
string username = string.Empty;
string password = string.Empty;
if (Request.Headers.TryGetValue("Authorization", out StringValues authToken))
{
string authHeader = authToken.First();
string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();
Encoding encoding = Encoding.GetEncoding("iso-8859-1");
string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword));
int seperatorIndex = usernamePassword.IndexOf(':');
username = usernamePassword.Substring(0, seperatorIndex);
password = usernamePassword.Substring(seperatorIndex + 1);
}
else
{
return BadRequest("Missing Authorization Header.");
}
//Build FilesUploadedListRequest
FilesUploadedListRequest filesUploadedListRequest = new FilesUploadedListRequest
{
Username = username,
Password = password,
PageNumber = pageNumber,
PageSize = pageSize
};
//Call GetUploadedFilesList
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
CancellationToken cancellationToken = cancellationTokenSource.Token;
Task<FilesUploadedListResponse> FilesUploadedListResponse = _clientService.GetListOfUploadedFilesAsync(filesUploadedListRequest, cancellationToken);
//Return results
if (filesUploadedListResponse.Result.Success)
{
return Ok(filesUploadedListResponse.Result);
}
return StatusCode(filesUploadedListResponse.Result.StatusCode, filesUploadedListResponse.Result.Reason);
}
ASP.NET Core 支持动作参数的 [FromHeader]
属性,类似于 [FromBody]
和 [FromQuery]
。因此,向您的操作添加 [FromHeader]string authorization
arg 将使您的解决方案减少几行,并使该方法更具可测试性,因为您可以避免访问 Request
对象。
我正在开发 ASP.NET Core 2.0 RESTful API。我有一个场景,我需要使用 HTTPGet 方法在我的 API 控制器上调用一个操作,并且我需要提取将用于调用另一个第 3 方 API 的用户名和密码值。用户名和密码与当前登录的用户身份无关,它们只是我想从我自己的 API 发送给另一个 API 的值,但我不想只传递它们查询字符串。
我可以在客户端使用基本身份验证将用户名和密码添加到 HttpRequestMessage 身份验证 header,然后在我的 ASP.NET Core 2.0 [=39= 中提取 header ] 控制器动作?
我的客户在调用 API
的代码中会有类似这样的内容 HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, relativeUrl);
var byteArray = new UTF8Encoding().GetBytes(string.Format($"username:password"));
request.Headers.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
而且,我的 API 控制器动作会像这样开始;
[HttpGet()]
public IActionResult GetUploadedFileList([FromQuery]int pageNumber, [FromQuery]int pageSize)
{
//Extract Authentication header values for username and password
}
任何人都可以提供如何从 HTTPGet 请求
中获取授权的示例 header我知道我可以使用 HTTPPost [FromBody] 轻松做到这一点,但我的用例要求此方法是 HTTGet。
在此先感谢您的帮助。
编辑 1 - 解决方案
由于 this link 的一些提示,我能够使下面的代码正常工作。虽然这看起来工作量很大,所以如果有人有更好或更清晰的解决方案,请 post 你的例子。
[HttpGet()]
public IActionResult GetUploadedFiles([FromQuery]int pageNumber, [FromQuery]int pageSize)
{
string username = string.Empty;
string password = string.Empty;
if (Request.Headers.TryGetValue("Authorization", out StringValues authToken))
{
string authHeader = authToken.First();
string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();
Encoding encoding = Encoding.GetEncoding("iso-8859-1");
string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword));
int seperatorIndex = usernamePassword.IndexOf(':');
username = usernamePassword.Substring(0, seperatorIndex);
password = usernamePassword.Substring(seperatorIndex + 1);
}
else
{
return BadRequest("Missing Authorization Header.");
}
//Build FilesUploadedListRequest
FilesUploadedListRequest filesUploadedListRequest = new FilesUploadedListRequest
{
Username = username,
Password = password,
PageNumber = pageNumber,
PageSize = pageSize
};
//Call GetUploadedFilesList
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
CancellationToken cancellationToken = cancellationTokenSource.Token;
Task<FilesUploadedListResponse> FilesUploadedListResponse = _clientService.GetListOfUploadedFilesAsync(filesUploadedListRequest, cancellationToken);
//Return results
if (filesUploadedListResponse.Result.Success)
{
return Ok(filesUploadedListResponse.Result);
}
return StatusCode(filesUploadedListResponse.Result.StatusCode, filesUploadedListResponse.Result.Reason);
}
ASP.NET Core 支持动作参数的 [FromHeader]
属性,类似于 [FromBody]
和 [FromQuery]
。因此,向您的操作添加 [FromHeader]string authorization
arg 将使您的解决方案减少几行,并使该方法更具可测试性,因为您可以避免访问 Request
对象。