从移动设备访问由 UAG 保护的 RESTful 资源
如果您尝试从移动设备与 UAG 集成,这个技巧适合您!
引言
如果您曾经开发过移动应用程序,或者正在开发,那么您迟早需要访问 Web 资源以获取您的应用程序所需的数据。 对于公共 Web 资源,这很容易,但是受保护的资源呢? 我发现自己处于这种确切的情况。 我正在用 C# 构建一个 iPad 应用程序,并通过 MonoTouch 编译。 我需要访问的资源已通过 UAG 设置了 SSO 基础结构。 我尝试成功地与 UAG 集成,搜索互联网的尽头,与所谓的 UAG 专家交谈等等,但没有成功...... 如果您尝试从移动设备与 UAG 集成,这个技巧适合您!
背景
在搜索与 UAG 集成以访问我们的 Web API 的过程中,我首先尝试根据 UAG 专家的指示为我们的 IIS 站点设置 Windows 身份验证。 有趣的是,当访问我的开发机器上托管的 Web API 时,我很快就让它工作了。 后来,我发现使用 Windows 7 的开发机器正在使用 NTLM V1。 当我尝试指向运行 Windows Server 2008 的测试服务器时,它不起作用,发现他们使用 NTLM V2,当时 Xamarin MonoTouch 不支持 NTML V2。 这迫使在 IIS 中切换到表单身份验证,并使用 UAG 登录页面来保护受保护的资源,在我们的例子中是 Web API。 没问题,对吧? 唉,我找不到任何有效的示例,也从 UAG“专家”那里没有得到任何有用的指导。
Using the Code
由于我们正在讨论通过网络消息传递进行身份验证,因此没有好的方法可以直接获取代码并“按原样”使用它(除非您的 UAG 配置与我的完全相同,祝您好运)。 也没有可以随时提供的屏幕截图或演示应用程序,因为登录表单和 Web 资源对于您的环境来说将是独一无二的。 也就是说,以下是您应该执行的步骤列表,以使代码在您的环境中工作
- 通过检查表单(即查看源代码)来自定义 UAGCustomLoginPage.cs 以与您的 UAG 登录表单对齐
- 自定义
GetFormDataAsStringFormat
方法以匹配输入字段,包括登录表单中的隐藏字段 - 自定义
TryParseLoginHtmlForSubmitFormUri
方法以与表单的提交方式对齐 - 按如下方式自定义 UAGProxy.cs
- 自定义
IsUriSecuredWithUAG
方法以期望相应的页面名称(默认为“/login.asp”) - 使用登录页面的 URL 调用
SSOProxyFactory.Create
- 对于返回的对象,使用用户名和密码调用
Login
在步骤 #3 和 #4 期间,您可能会幸运地直接工作。 但是,您可能需要进行故障排除,因为您的 UAG 环境可能存在一些细微的差异。 推荐的故障排除方法是
- 单步执行代码以查看问题所在
- 使用像 Fiddler 这样的工具来查看仅使用浏览器时端到端进程如何工作。 您可以将其与您在代码中看到的情况进行比较,并调整代码以匹配 UAG 和您的浏览器正在执行的进程。
注意:您可以使用桌面完成所有故障排除,无需移动设备。 在您在桌面上完成工作后,可以使用 Xamarin MonoTouch 等编译相同的代码,以编程方式登录,而无需向用户显示网页。
最后,一旦您能够完成身份验证过程,您就可以在 ISSOProxy
接口上获得所有 cookie 标头信息。 在向您的 Web API(或其他资源请求)提交请求时,使用这些 cookie/标头值。
关注点
最后,一旦您能够完成身份验证过程,您就可以在 ISSOProxy
接口上获得所有 cookie 标头信息。 在向您的 Web API(或其他资源请求)提交请求时,使用这些 cookie/标头值。
历史
- 2013 年 6 月 21 日:初始版本