C# 用于移动应用程序的用户身份验证和API保护的API规划

C# 用于移动应用程序的用户身份验证和API保护的API规划,c#,android,ios,security,authentication,C#,Android,Ios,Security,Authentication,我目前正在计划专门为iOS+Android应用程序构建一个API(C#MVC Web API)。使用此应用程序,用户将能够登录到他们在我们的系统上创建的帐户(此时不允许使用OpenID帐户,如Google/Facebook)。他们只需登录一次应用程序(想想Snapchat、Facebook、Uber等) API和应用程序之间的通信将使用HTTPS进行保护 我想弄明白的是以下两件事: 我是否在每个需要身份验证的API调用上都有应用程序提交用户名+密码,还是希望使用基于令牌的系统? 如果应用程序很少

我目前正在计划专门为iOS+Android应用程序构建一个API(C#MVC Web API)。使用此应用程序,用户将能够登录到他们在我们的系统上创建的帐户(此时不允许使用OpenID帐户,如Google/Facebook)。他们只需登录一次应用程序(想想Snapchat、Facebook、Uber等)

API和应用程序之间的通信将使用HTTPS进行保护

我想弄明白的是以下两件事:

我是否在每个需要身份验证的API调用上都有应用程序提交用户名+密码,还是希望使用基于令牌的系统?

如果应用程序很少被访问,并且应用程序不需要与此API之外的其他系统进行身份验证,那么基于令牌的系统会给我带来什么好处

为什么我不想在每次通话时提交用户名+密码

如何“尝试”保护API免受未经授权的访问?

我知道有人可以在他们的手机上设置根目录,并对程序进行解码,使他们能够通过监视API调用来发现API,从而使他们能够从外部访问API。我还知道,在任何人的设备上提供一个API密钥都不是很安全。据我所见,最好的方法是为下载应用程序的每个人提供一个唯一的API密钥


如果是这样的话,下一个问题是,应用程序不需要在每次调用时提供API密钥吗?因此,API不仅需要验证用户名+密码,还需要验证每个事务的API密钥?

一定要使用基于令牌的系统。OAuth是一个令牌系统,您将来会很高兴,即使是出于使用标准之外的原因

使用令牌系统可以避免将用户的凭据存储在设备上。您永远不应该在任何地方存储用户密码的可解密版本。令牌系统仍然要求您在用户的设备上存储一个秘密—身份验证令牌—但它是一个特权较低的秘密:您的服务器知道它连接到特定设备,更重要的是,它可以在不影响用户的其他设备的情况下随时被撤销

至于保护API,不用麻烦了。设计API使其安全,即使它是公开的。你不能依靠用户设备来提供可信的信息,即使你的应用程序没有被泄露。总是,总是,总是验证和双重检查传入的数据,尤其是如果它来自您无法实际控制的设备