是否可以使用相同的Web API控制器公开多个端点?

时间:2013-09-17 10:53:13

标签: asp.net-web-api

我想创建一个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以实现相互身份验证端点,并对其他端点使用表单身份验证。

3 个答案:

答案 0 :(得分:1)

简短回答:

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

<强> DESIGN

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

在设计控制器时,是否要使用其他JS库(如BreezeJS)来简化生活?开箱即用,您的Web API控制器将在api/{controller}/{id}中以WebApiConfig为前缀。如果您不使用BreezeJS之类的东西,可能需要添加{action}路由,以便您可以更灵活地使用控制器。

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

安全

您希望在[Authorize][ValidateHttpAntiForgeryTokenAttribute][Roles("")]以及其他一些数据注释中为初学者添加一些内容。这是一个很大的话题,在网上有大量的阅读材料 - 投资一些研究。您的控制器可以有多个具有不同限制的操作,例如阻止SPA上的CSRF,但通过在控制器上使用不同的操作或从单独的存储库中绘制,可以减少对Mobile的限制。

  

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

     

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

     

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

是的,绝对的。您只需要对路由配置文件进行一些额外的工作。使用BreezeJS,您不仅可以访问/api/,还可以/~breeze/访问非常相似的内容。

答案 1 :(得分:0)

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

ASP.NET团队的完整会话涵盖了这一点,你只需要选择你将选择哪一个:

Security issues for Web API.

答案 2 :(得分:0)

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