2

我想创建一个 WebAPI 服务以在我的单页应用程序中使用,但我也希望它也可用于移动应用程序。

当用户使用 SPA 时,他们使用表单身份验证登录并拥有会话 cookie,但如果他们使用的是移动应用程序,则情况并非如此。

是否可以将相同的 API 控制器公开为 2 个不同的端点,其中一个使用相互 SSL、令牌或作为最后手段的基本身份验证进行身份验证,而另一个使用会话 cookie?

例如采取以下控制器:

public class TodoController : 
{
    public IQueryable<TodoModel> GetTodos()
    {
        ...
    }
}

我可以添加多个映射到同一方法的路线吗?

https://myapp.example.org/api/todo
https://myapp.example.org/mutual-auth/api/todo 

我想将 IIS 配置为对相互身份验证端点使用相互 SSL,并对另一个端点使用表单身份验证。

4

3 回答 3

1

简短的回答:是的

这是一个非常广泛的问题,因此我不会对每个方面进行过多的详细介绍。我认为您还应该看看BreezeJS,因为它使构建这些应用程序的事情变得更加容易。

设计

您想构建纯 HTML 和 JavaScript 还是合并 CSHTML?决定权在您手中,但如果您最终希望使用诸如 PhoneGap Build 之类的东西创建基于本机的应用程序,您将希望坚持使用纯 HTML 和 JavaScript,以便以后可以编译代码。

您想在设计控制器时使用另一个 JS 库(例如 BreezeJS)让生活更轻松吗?开箱即用,您的 Web API 控制器将以api/{controller}/{id}in为前缀WebApiConfig{action}如果您不使用 BreezeJS 之类的东西,您可能需要添加路由,以便您可以更灵活地使用控制器。

最后,让我们谈谈存储库模式和工作单元模式。这是一个热门话题,但我发现通常创建存储库可以为您提供很大的灵活性,并且非常适合依赖注入。向控制器添加额外的存储库层可以让您非常轻松地区分不同的用户或访问方式,例如 SPA 或移动应用程序。您可以使用完全相同的控制器,但只需从不同的存储库中提取。

安全

对于初学者,您需要对[Authorize][ValidateHttpAntiForgeryTokenAttribute][Roles("")]和其他几个数据注释进行一些修改。这是一个巨大的话题,有大量的在线阅读材料——投资一些研究。您的控制器可以有多个具有不同限制的操作,例如阻止 SPA 上的 CSRF,但通过在控制器上使用不同的操作或从单独的存储库中提取来减少对移动设备的限制。

我可以添加多个映射到同一方法的路线吗?

https://myapp.example.org/api/todo

https://myapp.example.org/mutual-auth/api/todo

是的,一点没错。您只需要对路由配置文件做一些额外的工作。使用 BreezeJS,您不仅可以访问/api/而且/~breeze/工作方式非常相似。

于 2013-09-17T11:19:02.337 回答
0

假设您在 IIS 中托管 Web API,如果您启用表单身份验证,则会FormsAuthenticationModule建立身份。也就是说,如果您查看HttpContext.Current.UserThread.CurrentPrincipal在成功验证之后,类型的对象IPrincipal将具有标识(即FormsIdentity),并且该IsAuthenticated属性将设置为 true。您可以使用自定义对任何其他凭据执行相同的操作DelegatingHandler。您需要做的就是验证凭证(HTTP 授权标头中基本方案中的令牌、用户 ID 和密码等)并将 and 设置HttpContext.Current.UserThread.CurrentPrincipal类型GenericPrincipalGenericIdentity. 在此之后,带有修饰的控制器的相同操作方法Authorize将适用于两种类型的请求。

于 2013-09-17T13:23:51.303 回答
0

您可以使用您想要的方式保护您的Web API 。例如,您可以提供自定义Message Handler或自定义Authorization Filter以通过令牌提供外部身份验证。

ASP.NET 团队有一个完整的会议涵盖了这一点,您只需选择要选择的会议:

Web API 的安全问题。

于 2013-09-17T11:21:09.697 回答