我如何使用 WebClient 发送一个 Post 请求,其中在授权 header 中包含一个令牌
how can i send a Post request that include a token inside the authorization header using WebClient
我正致力于在两个 asp.net mvc web 应用程序之间构建安全集成;调用网络扫描应用程序的 ERP 系统。所以目前在接收器应用程序(网络扫描应用程序)上我有以下操作方法,只能由 ERP 系统执行:-
public async Task<ActionResult> ScanServer(string tokenfrom, string FQDN) //only the ERP system should be able to call this
{
string Token = System.Web.Configuration.WebConfigurationManager.AppSettings["Token"];//get the token from the web.config, this should be encrypted
if (tokenfrom != Token ) // check if the request is authorized by checking comparing the 2 tokens.
{
return new HttpStatusCodeResult(403, "request failed");
//code goes here..
}
在调用方系统(ERP 系统)上,我有以下调用上述操作方法的操作方法。
[HttpPost]
[CheckUserPermissions(Action = "", Model = "Admin")]//check if the user is defined as an admin inside my custom authorization system
public async Task<ActionResult> Scan()
{
try
{
string currentURL = System.Web.Configuration.WebConfigurationManager.AppSettings["scanningURL"];
string token = System.Web.Configuration.WebConfigurationManager.AppSettings["Token"];
using (WebClient wc = new WebClient())
{
string url = currentURL + "home/scanserver?tokenfromtms=" + token + "&FQDN=allscan" ;
var json = await wc.DownloadStringTaskAsync(url);
TempData["messagePartial"] = string.Format("Scan has been completed. Scan reported generated");
}
}
如上面的代码所示,我正在发送一个安全令牌,该令牌存储在 2 个应用程序的 web.config 文件中。通过这种方式,我可以确保(或者这是我的意图)网络扫描应用程序收到的任何请求都来自 ERP 系统(因为他们只知道令牌)。
但根据我的搜索和阅读,我意识到上述方法可能不是 100% 安全的,因此:-
- 任何有权访问 ERP 或网络扫描服务器的用户,都可以看到所有包含纯文本令牌的 url。因为服务器将所有 get 请求作为纯文本存储在其日志中,即使 urls 是 send/received over https,就像我的情况一样。
所以如果我发送令牌作为授权的一部分会更好header。
所以我的问题是如何在 webclient 中执行此操作:-
目前我正在将令牌作为 Get 请求发送,如下所示:-
string url = currentURL + "home/scanserver?tokenfro=" + token + "&FQDN=allscan" ;
var json = await wc.DownloadStringTaskAsync(url);
那么我如何修改它以将令牌作为授权的一部分发送 header?
- 第二个问题我将如何在网络扫描应用程序中收到此授权header?
谢谢
这是基本身份验证的示例。
var creds = string.Format("{0}:{1}", userName, Password);
var bytes = Encoding.ASCII.GetBytes(creds);
var header = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(bytes));
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = header;
并用于检查接收器。
var headers = request.Headers;
if (headers.Authorization != null && headers.Authorization.Scheme.Equals(AuthScheme))
{
var encoding = Encoding.GetEncoding("iso-8859-1");
var creds = encoding.GetString(Convert.FromBase64String(headers.Authorization.Parameter));
var parts = creds.Split(':');
var userName = parts[0].Trim();
var pwd = parts[1].Trim();
}
我正致力于在两个 asp.net mvc web 应用程序之间构建安全集成;调用网络扫描应用程序的 ERP 系统。所以目前在接收器应用程序(网络扫描应用程序)上我有以下操作方法,只能由 ERP 系统执行:-
public async Task<ActionResult> ScanServer(string tokenfrom, string FQDN) //only the ERP system should be able to call this
{
string Token = System.Web.Configuration.WebConfigurationManager.AppSettings["Token"];//get the token from the web.config, this should be encrypted
if (tokenfrom != Token ) // check if the request is authorized by checking comparing the 2 tokens.
{
return new HttpStatusCodeResult(403, "request failed");
//code goes here..
}
在调用方系统(ERP 系统)上,我有以下调用上述操作方法的操作方法。
[HttpPost]
[CheckUserPermissions(Action = "", Model = "Admin")]//check if the user is defined as an admin inside my custom authorization system
public async Task<ActionResult> Scan()
{
try
{
string currentURL = System.Web.Configuration.WebConfigurationManager.AppSettings["scanningURL"];
string token = System.Web.Configuration.WebConfigurationManager.AppSettings["Token"];
using (WebClient wc = new WebClient())
{
string url = currentURL + "home/scanserver?tokenfromtms=" + token + "&FQDN=allscan" ;
var json = await wc.DownloadStringTaskAsync(url);
TempData["messagePartial"] = string.Format("Scan has been completed. Scan reported generated");
}
}
如上面的代码所示,我正在发送一个安全令牌,该令牌存储在 2 个应用程序的 web.config 文件中。通过这种方式,我可以确保(或者这是我的意图)网络扫描应用程序收到的任何请求都来自 ERP 系统(因为他们只知道令牌)。
但根据我的搜索和阅读,我意识到上述方法可能不是 100% 安全的,因此:-
- 任何有权访问 ERP 或网络扫描服务器的用户,都可以看到所有包含纯文本令牌的 url。因为服务器将所有 get 请求作为纯文本存储在其日志中,即使 urls 是 send/received over https,就像我的情况一样。
所以如果我发送令牌作为授权的一部分会更好header。
所以我的问题是如何在 webclient 中执行此操作:-
目前我正在将令牌作为 Get 请求发送,如下所示:-
string url = currentURL + "home/scanserver?tokenfro=" + token + "&FQDN=allscan" ; var json = await wc.DownloadStringTaskAsync(url);
那么我如何修改它以将令牌作为授权的一部分发送 header?
- 第二个问题我将如何在网络扫描应用程序中收到此授权header?
谢谢
这是基本身份验证的示例。
var creds = string.Format("{0}:{1}", userName, Password);
var bytes = Encoding.ASCII.GetBytes(creds);
var header = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(bytes));
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = header;
并用于检查接收器。
var headers = request.Headers;
if (headers.Authorization != null && headers.Authorization.Scheme.Equals(AuthScheme))
{
var encoding = Encoding.GetEncoding("iso-8859-1");
var creds = encoding.GetString(Convert.FromBase64String(headers.Authorization.Parameter));
var parts = creds.Split(':');
var userName = parts[0].Trim();
var pwd = parts[1].Trim();
}