如何连接前端和后端?

时间:2020-04-14 17:45:57

标签: python asp.net authentication client-server

我有一台笔记本电脑上有一个用 ASP.NET (Visual Studio)创建的网页(前端),而另一台笔记本电脑上有一个用于我的网页的服务器(后端)。首先,我有一个登录页面,我想从textBox-es(前端)中获取用户名和密码,然后以某种方式将数据传输到另一台笔记本电脑,以验证其是否正确,然后接收数据是否正确。正确与否。前端在Windows上,服务器在Linux上。我的队友在后端使用python。

我正在使用HTML,CSS和前端的一些C#,并且我不知道如何将用户名和密码传输给队友以及如何从他那里得到答案。 他的笔记本电脑上有数据库,他是将验证对是否正确并向我发送答案的人,他也想用python编码。

我们认为我们可以在ASP.NET和Node.js之间建立魔术连接。

我该如何进行数据传输?

这是我第一次这样做,请保持温柔,因为我真的不知道该怎么办。

1 个答案:

答案 0 :(得分:1)

您的问题很广泛,尽管我不太熟练使用Web应用程序,但我将分享我可以提供的建议。因为问题很广泛,所以您无法获得准确,简短的答案。

有关您的问题的一些说明和反馈。

我有一个使用ASP.NET创建的网页(前端)...

您实际上在这里有一个Web应用程序(在您的情况下,它包含一个或多个网页)。多加注意这些小细节,编程本身就是一种语法自然主义,但它不是语法,您不会被人纠正,而是被机器和生活所纠正。 Web应用程序的一个很好的定义:https://blog.stackpath.com/web-application/

我们认为我们可以在ASP.NET和Node.js之间建立魔术连接。

我不是专门研究Web应用程序的,但是在我看来,这行代码是完全出乎意料的,您尚未表明您正在或打算在后端使用Node.js;您表示您正在使用Python,因此我将忽略此语句。 哦,没有魔法,只有比赛条件。

从结构上来说,我会将这个问题分为几个较小的问题。以下是一些建议。

因为您正在尝试执行一些更为复杂的任务,所以无法摆脱设计模式的想法(尤其是因为使用了设计为对模式友好的ASP.NET)。

所以你的第一个问题应该类似于

如何与Web服务器asp.net通信

另一种可能的旅行方式

如何将数据传输到服务器C#

根据您的说明,我假设您已经实现了UI表单,该表单将检索输入数据,因此我将跳过与UI相关的问题。

由于您希望通过互联网发送用户敏感数据,因此您必须考虑安全性。 进一步的问题

如何安全地将密码存储在数据库中

  1. 这个问题实际上将带您进入传输密码,甚至接收内容的示例

我还要讨论2个问题。

  1. 在互联网上搜索教程时,您可能会看到一个 在同一台计算机上同时处理客户端和服务器应用程序。 这些仍然是适合您的教程!阅读它们!我会解释 进一步讲,即使您的情况是这样,对您而言(几乎)相同的原因 远程服务器。

  2. 您需要以某种方式能够测试您的应用程序。

寻址#1

为什么要使用localhost(127.0.0.1)与使用真实服务器(在您的情况下)相同?

比方说,您完成了应用程序,后端也已完成,并且您希望彼此通信。您在Internet上阅读到您需要知道服务器IP的信息,因此请您的伴侣为他提供IP。您搜索狂野的网络并得出结论,找到您的IP可以尝试:

  • 执行ipconfig.exe(或根据平台使用什么工具)并获得IPv4 Address. . . . . . . . . . . : 192.168.1.12值。 您将假定这是您需要在应用程序中连接的IP。 这是假

  • 得出的结论是行不通的,您发现可以通过https://whatismyipaddress.com/等在线网站获取IP 并使用该IP作为您的服务器地址。 (在99%的情况下)这是FALSE。

一些诗歌

请考虑您在世界范围内寻址的IP,并将本地(私有)IP精确定位在您的房屋中。您看到的IP地址有一个本地IP,它会指出您坐在哪个椅子上,比方说已经提供的示例中的12个。世界上任何人(无论如何都有12把椅子)都可以坐在自己房子的第12把椅子上。您不能使用此信息来识别某人的地址。

您怎么知道IP是本地IP?

一种方法是查看ipconfig.exe的完整输出(或使用的任何工具),在该IP输出中,从上方看到Wireless LAN adapter Wi-Fi:的IP, LAN strong>表示( hxxps://en.wikipedia.org/wiki/Local_area_network )。

另一个(更直接的方法)是通过识别IP范围(或视觉模式,如果IP范围尚不明确的概念)。如果以198.168.开头,则它是本地/专用IP地址。请在此处阅读更多信息:https://en.wikipedia.org/wiki/Private_network

知识产权是一种有价值的商品(我不是在开玩笑)。随着世界的发展,您现在不能简单地用互联网电缆插入计算机,瞧,您拥有自己的IP。相对而言,数十年前的Internet最初是成立的,但现在IP由大型(大型)公司管理,他们按自己的意愿分配IP。

IP地址空间由Internet号码分配机构(IANA)以及五个在其指定地区负责分配给本地Internet注册表(例如Internet服务提供商)和其他终端的区域Internet注册表(RIR)进行全局管理用户。

Wiki引用:https://en.wikipedia.org/wiki/IP_address

我也强烈(请这样做)建议您阅读以下答案 hxxps://superuser.com/questions/323801/how-can-i-own-an-ip-address

如果您要求您的(现实世界)邻居查询https://whatismyipaddress.com/(他们与您拥有相同的ISP和月度计划),则很有可能看到他们您所看到的相同IP。简而言之,当您访问诸如whatismyipaddress之类的站点时,在此看到的IP是ISP已分配给您所在的网络节点的IP。为每个用户分配一个IP(而不是分配IP)会浪费IP。值得一提的是,实际上在数学上没有很多IP可以做到这一点。

关于您当前的困境。我可以看到3个选项。

选项1-购买主机

如果您的回答是“我真的很想拥有一个单独的IP”(或域),那么您将需要从托管服务购买一个IP(一种好的IP),该IP将指向托管公司拥有的设备。您通常会购买指向IP的域名,但暂时不要到那里。您将连接到该机器/设备,并在其中的服务器上安装代码。然后,只有到那时,您才能获得该计算机的IP /域,并在代码中使用它,然后它就会起作用(这是1%的情况,如whatismyipaddress之类的站点实际上会对您有所帮助)。

推荐的搜索:服务器托管廉价的:D(如果您是学生,则免费提供给学生)

选项2-在本地工作

如果您的项目用于学术界,并且实际上不需要单独的服务器,那么您和您的伙伴将在连接到同一无线调制解调器的同时运行客户端/服务器应用程序。要求他以这种方式获取IP(这里实际上需要LAN IP),然后将其硬编码到代码中(最好是一个单独的配置文件,这样就不需要额外的编译了),瞧,它可以工作。

选项3-Internet上的局域网

从技术上讲,这很难描述,但是您的想法是您使用通过Internet进行通信的程序,将它们分别安装在计算机上,以某种方式相互连接(通常是一个名称/密码对),并且该软件看起来像实际位于LAN设置(选项2)中的计算机上的程序。在我的日子里,我使用hamachi以便我们可以在线玩CS:D。

  • hxxps://www.howtogeek.com/172762/how-to-play-old-lan-games-over-the-internet/

关于#2

在您的合作伙伴提供服务器之前,您将需要测试代码。因此,您将需要以某种方式伪造服务器响应,以便实际上可以继续开发。

很简单,在代码中伪造某些东西(一个return /一个类)以便正确开发和测试代码的操作称为

如何模拟服务器响应asp.net

  • hxxps://gingter.org/2018/07/26/how-to-mock-httpclient-in-your-net-c-unit-tests/

对于初学者,我认为这是最复杂的部分之一。模拟和测试的概念虽然看起来很简单,但是通常不会被年轻,天真的,以前没有感染的未来程序员铭记在心。他们留在printfs上,直到毕业为止(即使是对测试的憎恨也撒在了混合物中,真可惜)。

出于礼貌,我希望进一步扩大这种疯狂。 请世上万事如意,不要在生产中使用此代码,在使用它理解一些基础知识后,再烧掉它吧!

我从此处Python 3.x BaseHTTPServer or http.server修改了代码,以便您可以在计算机上运行本地HTTP服务器并测试应用程序。您只需运行它(python3)并使用以下异教语法测试将用户名和密码发送到服务器:

127.0.0.1:4242/?user=aba&password=Aba1 ,它会返回我稍后再喝酒

#!/usr/bin/python
from http.server import BaseHTTPRequestHandler,HTTPServer
from urllib.parse import urlparse, parse_qs
HOST = '127.0.0.1'  # Standard loopback interface address (localhost)
PORT_NUMBER = 4242  # Port to listen on (non-privileged ports are > 1023)

# !!!!!!!!!!!!!!! THIS IS ONLY FOR DIDACTICAL PURPOSE< NEVER EVER DO SOMETHING LIKE THIS IN PRODUCTION!!!!!!!
# NEVER EVER STORE PASSWORDS LIKE THIS !!!!!!!
# LITERRLAY NEVER!!!!!!
data_base = [
    {
        'user': 'ionzapada',
        'password': 'neaomat',
        'data': b"I like pie!"
    },
    {
        'user': 'aba',
        'password': 'Aba1',
        'data': b"I'al cohol you later"
    }
]

class myHandler(BaseHTTPRequestHandler):

    #Handler for the GET requests
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type','text/html')
        self.end_headers()
        # Send the html message

        query_components = parse_qs(urlparse(self.path).query)
        # DO NOT USE THIS LOGIC ON ANY PRODUCTION PLATFORM!!!!
        # NEVER SEND PASSWORDS THIS WAY!!! 
        # NEVER SEND PASSWORDS!!!! 
        # NEVER SEND HASHES WITHOUT SALT!!!! 
        # NEVER IMPLEMENT YOUR OWN TRICKY ALGORITHM!!!!
        user_name = query_components.get("user",[None])[0]
        password = query_components.get("password",[None])[0]
        if user_name and password:
            for data_base_entry in data_base:
                if data_base_entry['user'] == user_name:
                    print('Found searched user: {}'.format(user_name))
                    if data_base_entry['password'] == password:
                        print('Valid password for user {} given; returning db data'.format(user_name))
                        self.wfile.write(data_base_entry['data'])
                    else:
                        self.wfile.write(b"Not supported!")
        else:
            self.wfile.write(b"Not supported!")        
        return

try:
    server = HTTPServer((HOST, PORT_NUMBER), myHandler)
    print('Started httpserver on port', PORT_NUMBER)
    server.serve_forever()

except KeyboardInterrupt:
    print('CTRL+C received, shutting down the web server')
    server.socket.close()

我很费力地写道,永远不要以这种方式发送用户名和密码!!!即使出于上帝的爱也不要发送密码!搜索标准且安全的方法!!!!

也请访问@amc所示的链接,这也是一个很好的开始。

P.S。在一篇文章中,我不允许有超过8个链接,在我发布的某些链接上,将hxxp更改为http才能使它们工作。