2

我有一个 ASP.NET MVC 3 应用程序,它带有一个提供数据的自托管 ServiceStack API。在 Web.Config 中添加 API 位置路径后,API 可由我的代码调用并且运行良好:

<location path="api">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>

我遇到的问题是,当应用程序运行时,可以通过浏览器访问 API - 我只需在浏览器中键入 http:\localhost:xxxx\api。什么是限制对我的自托管 API 的访问的好方法,以便我可以继续在 MVC 3 应用程序中调用它,但阻止用户通过浏览器访问 API?

请注意,在将来的某个时候,我将希望公开 API 的某些区域以使它们可以公开访问。

4

2 回答 2

2

一种可能性是使用特定用户来访问 API:

<location path="api">
    <system.web>
        <authorization>
            <allow users="api_user" />
        </authorization>
    </system.web>
</location>

然后将您的 API 配置为只能由api_user. 这样浏览器中的任何其他经过身份验证的用户都将无法访问此 API。在您的 ASP.NET MVC 3 应用程序中,您可以在向 API 发送 HTTP 请求之前使用给定用户创建身份验证票证。

另请注意,使用<location>web.config 中的标记来控制 ASP.NET MVC 应用程序中的授权是一个非常糟糕的主意。这样做的原因是您依赖于一些 url (api)。但是 ASP.NET MVC 使用路由。因此,您应该使用[Authorize]或自定义授权属性来装饰您要保护的相应控制器/操作。这样您的授权不再依赖于您的路由配置。

另一种可能性是使用自定义授权属性并实现访问令牌

于 2012-05-10T11:47:31.203 回答
2

注意:ServiceStack内置的授权和身份验证支持是独立的,并且与 ASP.NET 的身份验证分离。

您通常可以通过从包含以下一项或多项的基类继承来限制对所有服务的访问:

  • [Authenticate] - 只允许经过身份验证的用户访问
  • [RequiredRole] - 只允许指定角色的用户访问
  • [RequiredPermission] - 只允许具有指定权限的用户访问

注意:这些属性也适用于从ServiceStackController或标有[ExecuteServiceStackFilters]属性的控制器继承的 MVC 控制器。

您可以在Social Bootstrap Api示例项目中检查使用这些属性的 MVC + ServiceStack 演示。

另一种一般限制访问的方法是注册一个全局请求过滤器,该过滤器在每个请求上执行。

于 2012-05-10T16:32:17.680 回答