我正在尝试在使用WebApi服务的跨平台移动应用程序上实现身份验证和识别。
我的计划是将身份验证导出到联合云服务,例如新的Azure移动服务。客户端移动应用程序将使用移动服务身份验证流程,获取令牌,而不是将请求的头部内部发送到WebApi,然后WebApi将对其进行验证并从中提取UserId。
假设我已经使用DelegatingHandler
拦截器配置了WebApi验证JWT令牌,
是否可以验证Azure移动服务发布的令牌?
SymmetricKey,Issuer和Audience的正确值是什么?
我是朝着正确的方向前进的吗?
答案 0 :(得分:2)
http://www.thejoyofcode.com/Generating_your_own_ZUMO_auth_token_Day_8_.aspx上的帖子显示了如何生成 Azure移动服务令牌,但是它还具有验证它所需的信息。基本上,您需要用来验证它的密钥是来自服务的主密钥(不要将该密钥分发给任何客户端,但如果它在您的服务中安全编码,则应该没问题)。观众取决于创建令牌的提供者(例如,对于FB,它是字符串"Facebook"
)。发行人设置为urn:microsoft:windows-azure:zumo
。
答案 1 :(得分:1)
您在WebAPI
项目中需要做的是实现一个自定义消息处理程序来拦截令牌,并使用AMS
中的相同主密钥对其进行签名验证。 GitHub上有一个项目,展示了如何做到这一点:
这基本上是另一个GitHub项目的衍生物,它在这里有原始的ASP.NET样本:
主要验证在调用ValidateSignature()
方法时发生,该方法获取JWT Claim段的UTF-8表示的字节,并使用{{1}中的共享密钥计算它们上的HMAC SHA-256 MAC }。如果JWT加密段和先前计算的值,则确认该密钥用于在JWT上生成HMAC并且JWT索赔段的内容未被篡改。
我发现的一个主要问题是删除将附加的Azure Mobile Services
字符串附加到"JWTSig"
方法中的主密钥。看来签名的令牌不再将该字符串附加到ValidateSignature()
的主密钥。在删除该段之前,我遇到了各种麻烦。