如何修饰客户端方法以在 Azure 移动应用服务中包装身份验证?

How do I decorate a client method to wrap authentication in Azure Mobile App Services?

有问题的系统是移动应用服务 Xamarin.Forms 应用程序,后端为 C# 5.0 / MVC 5.0 / Web API 2.0。该应用程序使用 LoginAsync 在客户端进行自定义身份验证,并在 ApiController 和 TableController 类 和后端方法上使用“[Authorize]”装饰。当前没有 automatic 工作流来在后端调用返回未经授权的 HTTP 状态代码时显示自定义身份验证屏幕。为进行数据库调用的 every 方法在客户端添加下面的身份验证代码是重复且庞大的。我想创建一个自定义的客户端属性(或等效属性),它可用于装饰客户端 类 或在给出未经授权的响应时将处理身份验证的方法。

包装的方法应该在功能上进入这个结构:

try { ... // Decorated, attributed, or wrapped method } catch(MobileServiceInvalidOperationException msioe) { if(msioe.Response.StatusCode == HttpStatusCode.Unauthorized) { ... // Perform login activities } }

如何实现将相同的身份验证代码应用于选定方法的简单方法(例如,使用派生自 IActionFilterAttribute 或 IAuthenticationFilter 的自定义属性)?

最简单的方法是添加一个委托处理程序来捕获 401 响应并启动身份验证流程。下面是如何执行此操作的示例:https://github.com/azure-appservice-samples/ContosoMoments/blob/dev/src/Mobile/ContosoMoments/AuthHandler.cs

要使用,请将其作为参数添加到您的 MobileServiceClient 构造函数调用中:

new MobileServiceClient(URL, new AuthHandler());