0

我正在 Azure 上构建一个 mvc 4 web api 项目。对此 API 的请求通过以下路径:

      routes.MapHttpRoute(
            name: "DefaultApi", // Route name
            routeTemplate: "api/{controller}/{id}", 
            defaults: new { id = RouteParameter.Optional }
      );

在同一个域和不同的路由上,我设置了一个 mvc 网站:

      routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      );

mvc 网站只是一个 HTML 和 Javascript 页面,它与访问控制服务交互以获取令牌,然后将令牌传递给服务以通过 jQuery ajax 获取数据。

为了实现服务的安全性(验证发送到 API 的令牌),我使用了本文所述的 SWTModule 和 TokenValidator 类以及我的 MVC 4 Web 应用程序项目 Web.Config system.webserver 属性中的调用:

<modules runAllManagedModulesForAllRequests="true">
  <add name="SWTModule" type="SecurityModule.SWTModule, SecurityModule" />
</modules>

即使我没有使用 [Authorize] 标记 MVC 控制器方法,加载默认网页也会导致此错误:

“/”应用程序中的服务器错误。

未经授权

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ApplicationException:未经授权

源错误:

第 43 行: 第 44 行: // 检查它是否以 'WRAP' 开头 第 45 行: if (!headerValue.StartsWith("WRAP ")) 第 46 行:
{ 第 47 行: throw new ApplicationException("unauthorized");

源文件:D:\Dev\VisualStudio2010\Projects\myServices\Azure\myDataInterfaces\SecurityModule\SWTModule.cs 行:45

堆栈跟踪:

[ApplicationException: 未经授权]
D:\Dev\VisualStudio2010\Projects\myServices\Azure\myDataInterfaces\SecurityModule\SWTModule.cs:45 System.Web.SyncEventExecutionStep.System.Web 中的 SecurityModule.SWTModule.context_BeginRequest(Object sender, EventArgs e)。 HttpApplication.IExecutionStep.Execute() +80 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +270

在我看来,即使我没有用 [Authorize] 标记我的 Controller 方法,它们也会被拒绝,因为我的 SWT 令牌验证会针对每个响应触发,大概是因为它在 Web 堆栈中被较早地调用,因为包含在Web.Config 属性?

有人可以为我指出如何使这项工作的正确方向吗?我想让默认网页(主页控制器索引方法)显示我的登录屏幕,然后重定向到主页。如果用户未使用可用的 ACS 身份提供者之一登录,则该主页应返回未经授权。同样,我想将我的一些 Web API ApiController 方法公开,并要求其他人获得授权。

目前,我在 Visual Studio 中的单个 Web 角色解决方案中的单个 Web 应用程序项目中通过单个 Global.asax 文件路由 MVC 应用程序和 Web API 服务。我想知道解决此问题的方法是否是将 HTML MVC 站点和 Web API 分离到同一 Web 角色解决方案下的不同 Web 应用程序项目中?那仍然不能给我分配某些控制器方法的授权要求的方法,只是给我一个路由控制器和 ApiController 的不同位置。

我觉得我很接近但可能错过了一些重要的东西,但我似乎没有在网上找到它。有人会理我吗?

谢谢,亚历克斯

4

2 回答 2

1

您的帖子中有几个问题,因此不确定您的期望是什么。我只会回答你关于模块为什么不工作的问题,因为这似乎是主要的。

是的,SWTModule 将拦截所有调用,解释为什么在您访问 MVC 路由时它会失败。该模块对 Authorize 属性一无所知。如果你想让它工作,你最好听从 Aliostad 的建议并使用 DelegatingHandler。如果你想“简单地”让它现在工作,你可以检查模块中请求的执行路径,以便它只检查你的 api 的路径(请注意,这不适用于公共 api 方法,因为模块不是知道属性)

是的,使用 2 个单独的项目也可以,因为该模块将仅应用于添加它的项目。

同样,这些是让它工作的快速而肮脏的路径,如果这是使用 ACS 的 POC,那可能很好。否则,你将不得不做更多的功课。Dominick 写了一些关于这个主题的非常好的文章。查看文章“ASP.NET WebAPI 安全 #1 到 #4”

于 2012-06-02T14:29:39.553 回答
0

首先,在我看来,您的授权机制会引发异常。通常你会返回一个状态为 403“禁止”的请求。

在 Web API 中执行此操作的正确方法是创建DelegatingHandler而不是模块。

看看 Dominick Baier 的ThinkTecture

还不要脸的

于 2012-06-02T10:47:00.790 回答