python - 如何使用内置的身份验证机制保护Azure WebApp的安全

标签 python azure docker authentication flask

我使用Python创建了Flask-Webservice,该服务在docker容器内独立运行。然后,我将Docker镜像上传到Azure容器注册表。从那里,我可以在运行该容器的Azure门户中单击几下创建一个WebService(用于容器)。到现在为止还挺好。它的行为就像我想要的那样。

但是,我当然不希望任何人访问该服务。所以我需要某种身份验证。幸运的是(或者我认为)有一个内置的身份验证机制(我认为它是基于OAuth的。我不太了解安全性问题)。它的documentation在实际发生的事情上有些稀疏,并且集中在C#中的解决方案上。

我首先按照here所述与Google创建了一个项目,然后使用Client-Id和Secret配置了WebApp-Authentication。我当然也给Google提供了Java脚本源和callback-url。

当我现在注销我的Google帐户并在浏览器中尝试对Web服务的GET请求(GET应该只返回“hello world” -String)时,我迎来了登录屏幕……正如我所期望的那样。

现在再次登录Google时,我会在浏览器中使用参数中的某些信息重定向到回调URL。

a token perhaps? It looks something like this:

https://myapp.azurewebsites.net/.auth/login/google/callback?state=redirxxx&code=xxx&authuser=xxx&session_state=xxx&prompt=xxx).



这里出现了问题,因为出现了错误。

An error occurred.

Sorry, the page you are looking for is currently unavailable. Please try again later.

If you are the system administrator of this resource then you should check the error log for details.

Faithfully yours, nginx.



就我现在而言,nginx是托管我的代码的服务器软件。我可以想象它也应该处理身份验证过程。显然,在关闭身份验证后,它可以让所有请求都通过我的代码,但以其他方式阻止未经身份验证的访问,并重定向到Google登录名。然后,Google检查您的帐户是否已获得该应用程序的授权,并将您连同访问 token 一起重定向到回调。然后返回一个cookie,该cookie应该授予我的浏览器对该应用程序的访问权限。 (我只是在这里复制文档)。

所以我的问题是:出了什么问题。我的浏览器是否接受cookie。在Google Apps或WebApp中配置身份验证时,我是否出错了?我是否必须使用某个开发堆栈才能使用身份验证。我使用的任何技术(Python,Flask ...)都不支持它。

编辑

@miknik:

在Microsoft的身份验证/授权文档中说

The authentication and authorization module runs in the same sandbox as your application code. When it's enabled, every incoming HTTP request passes through it before being handled by your application code.

...

The module runs separately from your application code and is configured using app settings. No SDKs, specific languages, or changes to your application code are required.



因此,虽然您可能正确的是,回调重定向中的信息是授权授权/代码,并且在此之后现在应该使用此代码从Google获取访问 token ,但我不太了解如何在我自己的系统中工作情况。

据我所知,Microsoft在Azure上用于容器资源的WebApp应该自动获取 token ,并将其作为对回调请求的响应的一部分返回。该文档说明了4个步骤:

  1. Sign user in: Redirects client to /.auth/login/.
  2. Post-authentication: Provider redirects client to /.auth/login//callback.
  3. Establish authenticated session: App Service adds authenticated cookie to response.
  4. Serve authenticated content: Client includes authentication cookie in subsequent requests (automatically handled by browser).


在我看来,第2步失败了,而这恰恰是您编写的内容:服务器将使用授权授予来获取访问 token ,但不会。

但是我对此也没有任何控制权。也许有人可以通过在其他一些方面纠正我来解决问题:

首先,我不太清楚问题的哪些部分代表了OAuth方案中的哪个角色。
  • 我认为我是所有者,并且通过将用户添加到Google+项目的列表中,我授权他们使用我的服务。
  • Google显然是授权服务器
  • 我的Web服务(或更好的是我的容器Web应用程序)是资源服务器
  • ,最后是执行请求的应用程序或邮递员是客户

  • 在OAuth的说明中,我读到有问题的步骤归结为:资源服务器从授权服务器获取访问 token ,并将其传递给客户端。通过使用回调URL进行调用,Azures WebApps资源将被提示(并启用)。我在这个地方对吗?

    las,我同意我不太了解整个协议(protocol)。但是我发现网上的大多数描述都没有帮助,因为它们不是特定于Azure的。如果有人知道很好的解释,一般性的或特定于Azure的,请发表评论。

    最佳答案

    我找到了一种使它起作用的方法,并且我尽力尽力解释出了什么问题。如果我输入错误或使用错误的单词,请纠正我。

    我怀疑问题不是因为我不了解OAuth(或者至少不了解Azure如何管理),而是因为我了解Azure WebApp Service的内部工作原理(加上我的部分不良编程)。 Azure运行自己的服务器,并且未使用flask的内置服务器。实际的问题是我的 flask 程序没有实现WSGI接口(interface)。据我所知,这是python脚本与任何服务器交互的另一个标准。因此,尽管可以从服务器进行基本的调用(我认为Azure使用nginx),但更复杂的调用(例如,重定向到回调URL的重定向转到了dev / null)。

    我在this tutorial之后构建了一个新应用,然后按照authentication/authorization-tutorial对其进行了保护,一切正常。本教程中的代码实现WSGI,并且可能更符合Azure的期望。我的Docker解决方案太简单了。

    我的结论是:继续阅读 flask 一直警告我的WSGI标准,并且我没有在开发过程中费解的任何代码中都没有收听和实现它。

    关于python - 如何使用内置的身份验证机制保护Azure WebApp的安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51209613/

    相关文章:

    azure - Functions Bot 是否不再是 Azure 中推荐的机器人服务?

    docker - 多个 FROM - 这意味着什么

    docker - 无法启动 Elasticsearch ,因为找不到JAVA_HOME

    python - 在 docker 镜像中安装 Python3.9 和 pip(而不是 python 3.8)

    查找素数的 Python 程序 (3.5)

    python - VirtualEnv导入错误: No module named MySQLdb

    c# - Microsoft.Azure.Cosmos.Table LocationMode.SecondaryOnly RA-GRS 异常 此操作只能针对主存储位置执行

    c# - 如何从 C# 连接到 Azure Analysis Services?

    python - Django 手动渲染表单并使用 csrf token

    python - 了解 OSX 中的 $PYTHONPATH