【问题标题】:Securely Exposing C# REST API to scripting language such as Python将 C# REST API 安全地暴露给脚本语言,例如 Python
【发布时间】:2016-10-29 00:10:47
【问题描述】:

我的 C# REST API 是从 AngularJS 网络应用程序调用的。我通过验证用户并确保用户是特定 Windows 组的一部分来保护 Web API。

现在客户希望选择从脚本 (Python) 调用 API。我该如何实施?我应该让他们在 json 调用中传递用户名和密码吗?

【问题讨论】:

  • 为什么不使用与 web 相同的身份验证机制?
  • 我正在使用 cookie 和来自另一台服务器的授权,该服务器期望它来自浏览器。这是不可行的
  • 没有什么是 python http 库无法处理的。但是如果你想让它更简单,HTTP basic auth 和 openid/OAuth 对于 API auth 来说是很常见的
  • 您能否发布一些代码,显示您当前是如何执行身份验证和授权的?
  • 这个问题太笼统了。您可以使用许多不同的身份验证方案:令牌、基本身份验证、普通用户名和密码,甚至是带有 cookie 的当前方案(python 脚本也可以使用 cookie)。您可以在 Internet 上的许多地方阅读有关 C# Web api 的身份验证方案。

标签: c# python rest security


【解决方案1】:

如果您可以轻松地在 Python 中增加标头,我建议您使用令牌身份验证。 Microsoft 不直接提供这种类型的身份验证,而是通过 OWIN 项目提供。它并不难使用,但你需要先了解它的工作原理。有一个很好很全面的教程here

基本上,您通过提供用户名/密码来获得令牌(在一段时间内有效)。此令牌是加密/签名的,这意味着您的后端将信任不需要在每个请求上验证用户名/密码(这很昂贵)。然后,您需要将此令牌添加到标头 Authorization bearer token 或每个请求的类似内容中。或者,如果您愿意,我认为您可以在 cookie 中包含令牌以保持向后一致性。

我建议您在 Angular 中也使用相同的机制,因为您可以轻松地在那里添加拦截器并避免 cookie 和 CSRF 潜在的麻烦。

【讨论】:

    【解决方案2】:

    使用与您当前使用的完全相同的身份验证方法。

    这是一个使用 python 的基本示例(未经测试):

    from requests.auth import HTTPBasicAuth
    s = requests.Session()
    
    # Make the initial authentication request from a session object
    s.get('https://omg.wtf/user', auth=HTTPBasicAuth('user', 'pass'))
    
    # All subsequent requests from that session will include any cookies set in the initial response
    r = s.get('http://omg.wtf/911')
    print(r.text)
    

    【讨论】:

    • 是否可以重定向到python脚本并设置cookie?
    • 重定向是什么意思? cookie 存储在 s = requests.Session() 中,您始终可以使用 cookie/session 发出新请求。
    • 调整@SeanThorburn 的原始代码,以便也从会话对象发出初始请求。该对象将记住初始响应中设置的任何 cookie,并在后续请求中发送这些 cookie 值。
    猜你喜欢
    • 2012-04-19
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2012-01-03
    • 1970-01-01
    相关资源
    最近更新 更多