在花了几个月试图解决这个问题后,我终于要求你的帮助。
方案: Ajax调用webapi方法传入用户名和密码。如果用户有效,会话ID /令牌将返回给客户端。 此令牌将在所有后续请求中传递;也许使用时间戳来进一步保护方法。
我理解这个理论,我需要的是示例代码。 带有用户名和密码字段的HTML页面。 单击“登录”按钮,在asp.net WebAPI中对rest方法进行Ajax调用,以对自定义成员表进行身份验证。
如果一切正常,请将令牌发送到客户端(将存储在用户设备上)
任何指导都将不胜感激。
答案 0 :(得分:3)
鉴于您正在打开用户名和密码的端点,您应该阅读here下的4.4.3. Resource Owner Password Credentials所描述的一些威胁(使用用户名和密码的OAuth2流) - 建议仍然非常即使这不是OAuth解决方案也很重要,这包括基本知识,例如使用SSL进行传输级安全性,但它也列出了许多其他威胁和对策......
在JavaScript中使用用户的凭据本身就是一种威胁。 OAuth 2规范将隐式授权流描述为使用JavaScript获取会话(access_token)的首选方法,隐式流旨在使凭证远离javascript。这种方法有here的示例;但是,这将涉及您使用第三方提供商安装授权服务器或使用DotNetOpenAuth之类的方式实现您自己的服务(这不是一些好的方案here)。
但假设您排除了OAuth 2和隐式授权流程等,那么......
我已经在线here放置了一个示例,它通过AJAX使用Basic auth返回一个Json Web令牌JWT会话令牌,用于所有后续请求。
我的例子是基本的,因此令牌存储在内存中;但是,可以使用cookie,本地存储等在Web环境中将令牌存储更长时间。
我的示例使用了Thinktecture的IdentityModel包。
下面还有其他示例和详细的演练,这些应该可以作为进一步的参考和指导......
我的例子借鉴了上述问题How to use Basic Auth with jQuery and AJAX?
如果您的登录表单和API位于不同的域上,那么您还需要调查CORS或JSONP,请务必在服务器上使用会话签名密钥,该密钥是安全存储并隐藏在服务器上的。密钥当前在WebApiConfig.cs中进行了硬编码,也一定要重新启用必须通过SSL选项。
一旦是PhoneGap
您的服务器可能会相同,但您可以使用PhoneGap框架来替换您的一些JavaScript ......