当前位置: 首页 > 知识库问答 >
问题:

如何使用WebClient发送在授权标头中包含令牌的Post请求

西门品
2023-03-14

我正在努力构建两个asp.netmvc 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");

               }




           }

如上面代码所示,我正在发送一个安全令牌,它存储在两个应用程序的web中。配置文件。通过这种方式,我可以确保(或者这是我的意图)网络扫描应用程序收到的任何请求都是来自ERP系统的(因为他们只知道令牌)。

但是根据我的搜索和阅读,我意识到上述方法可能不是100%安全的,因为这个原因:-

  1. 任何有权访问ERP或网络扫描服务器的用户都可以以纯文本形式查看包含令牌的所有URL。因为服务器将所有get请求以纯文本形式存储在其日志中,即使URL是通过https发送/接收的,就像我的情况一样

因此,如果我将令牌作为授权标头的一部分发送,效果会更好。

因此,我的问题是如何在webclient中做到这一点:-

>

  • 目前我正在将令牌作为获取请求发送,如下所示:-

    string url=currentURL“主页/扫描服务器”tokenfro=“令牌”

    那么我如何修改它以将令牌作为授权标头的一部分发送呢?

    谢谢

  • 共有1个答案

    空俊语
    2023-03-14

    这是基本身份验证的一个示例。

    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();
    
    }
    
     类似资料:
    • Im使用Spring-Security和JWT库生成令牌。当用户通过身份验证时,我得到授权令牌作为响应: 在所有教程中,我都看到作者在使用POSTMAN发送GET请求时将此令牌粘贴在授权标头中,但没有教程说明它如何在实际请求中工作。尽管在我的邮递员中,当我粘贴标题时,它是有效的,我得到了200个OK。 我想知道如何在真正的代码中包含这个标题? 编辑 这是我的前端请求。在这个调用之后,我得到带有授权

    • 我已经实现了一个使用基本身份验证(使用Spring Security性)的web服务器。 我在访问URL时禁用了默认身份验证入口点(它只返回401,而不是用www身份验证标头响应401),目的是防止浏览器显示身份验证弹出窗口。 我能够用javascript代码和命令行工具(如curl)连接到服务器,但是当我用浏览器(chrome)测试它时 <代码>curl-v-u用户:密码本地主机:8080/用户

    • 嘿,我想弄清楚如何为REST API POST调用使用OAuth授权令牌。 文件规定: 如果发生此错误,您的应用程序可以通过重新运行相应的流来请求新的访问令牌。 目前我的VB. net代码是这样的: 我不断收到一个错误:远程服务器返回一个错误:(401)未经授权。 我在下面的帖子中发现了这一点: Yammer API要求OAuth数据位于标头中。如果您查看他们获取数据的示例,您将看到请求如下所示。

    • 我使用springfox 2.9.2我有这样的api: 女巫来自身份验证服务器。我尝试在swagger中首次调用此服务器,并将其传递给像上面这样的控制器请求。所以我做 在Swagger ui上,授权调用成功返回了令牌,但它没有将令牌添加到请求头中。它会产生 如果我像这样设置令牌:

    • 当我发布带有授权头的请求API时,我在角4中有一个问题? 令牌来自firebase auth 我用这个叫邮局 回复403!!! 请求URL:https://us-central1-xxxxxx-prod.cloudfunctions.net/api/post请求方法:选项 状态代码:403 远程地址:216.58。198.51:443 引用方策略:降级时无引用 响应头 访问控制允许方法:获取、发布

    • 向带有某些头的endpoint发出邮递员请求 当我运行下面的代码时 它返回了我所期望的一切,如下所示 问题只出在Axios请求上,而不是其他任何事情。这里面出了什么问题?