将 C# REST API 安全地暴露给诸如 Python 之类的脚本语言。

9
我的C# REST API被AngularJS web应用程序调用。我通过验证用户身份并确保用户是特定Windows组的一部分来保护Web API。
现在客户希望从脚本(Python)调用API。我该如何实现?我应该让他们在json调用中传递用户名和密码吗?

为什么不使用与Web相同的身份验证机制? - Niklas B.
我正在使用cookie和来自另一个服务器的授权,该服务器期望从浏览器中获取它。这并不可行。 - Robben_Ford_Fan_boy
2
没有什么 Python HTTP 库无法处理的。但如果你想让它更简单,HTTP 基本认证和 OpenID/OAuth 对于 API 认证非常常见。 - Niklas B.
你能否发布一些代码,展示你目前如何执行身份验证和授权? - Jeffrey Patterson
2
这个问题太过宽泛。您可以使用许多不同的身份验证方案:令牌、基本认证、纯用户名和密码,甚至当前与Cookie一起使用的方案(Python脚本也可以使用Cookie)。您可以在互联网上的许多地方阅读有关C# Web API身份验证方案的信息。 - Evk
显示剩余3条评论
2个回答

5
如果您可以轻松地在Python中增强标头,我建议您使用令牌身份验证。Microsoft没有直接提供此类身份验证,但通过OWIN项目。使用起来并不难,但您需要先了解如何工作。这里有一个非常好的全面教程(链接)

基本上,您通过提供用户名/密码获得一个令牌(有效期一段时间)。该令牌已加密/签名,这意味着您的后端将信任它,而无需在每个请求上验证用户名/密码(这是昂贵的)。然后,您需要为每个请求添加此令牌到一个名为Authorization bearer token或类似的标头中。或者,如果您喜欢,您可以在cookie中保存令牌以保持向后兼容性。
我建议您在Angular中也使用相同的机制,因为您可以轻松地在那里添加拦截器,并避免使用cookie和CSRF潜在问题。

3

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

以下是使用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? - Robben_Ford_Fan_boy
什么是重定向?cookie存储在s = requests.Session()中,您可以始终使用cookie/session创建新的请求。 - Sir Crusher
修改@SeanThorburn的原始代码,使初始请求也从会话对象中进行。该对象将记住初始响应中设置的任何cookie,并在后续请求中发送这些cookie值。 - Doug Schmidt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接