Jquery 通过IHttpModule和mvc 4以及web api访问控制服务,站点和服务的不同安全设置?

Jquery 通过IHttpModule和mvc 4以及web api访问控制服务,站点和服务的不同安全设置?,jquery,azure,asp.net-web-api,federated-identity,accesscontrolservice,Jquery,Azure,Asp.net Web Api,Federated Identity,Accesscontrolservice,我正在Azure上构建一个MVC4WebAPI项目。对该API的请求通过以下路径进行: routes.MapHttpRoute( name: "DefaultApi", // Route name routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); 在同一个域和不同的路径

我正在Azure上构建一个MVC4WebAPI项目。对该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 web站点只是一个HTML和Javascript页面,它与访问控制服务交互以获取令牌,然后通过jQueryAjax将令牌传递给服务以获取数据

为了实现服务的安全性(验证发送到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行:如果(!headerValue.StartsWith(“WRAP”))第46行:
{第47行:抛出新的 应用程序异常(“未经授权”)

源文件: D:\Dev\VisualStudio2010\Projects\myServices\Azure\myDataInterfaces\SecurityModule\SWTModule.cs 电话号码:45

堆栈跟踪:

[应用程序异常:未经授权]
SecurityModule.SWTModule.context_BeginRequest(对象发送方,事件参数 e) 在 D:\Dev\VisualStudio2010\Projects\myServices\Azure\myDataInterfaces\SecurityModule\SWTModule.cs:45 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80 System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值&同步完成)+270

在我看来,即使我没有用[Authorize]标记我的控制器方法,它们也会被拒绝,因为我的SWT令牌验证正在为每个响应触发,大概是因为它在web堆栈的前面被调用,因为它包含在web.Config属性中

有没有人能给我指出正确的方向,告诉我怎么做?我想让它成为默认的网页(Home controller索引方法)显示我的登录屏幕,然后重定向到主页。如果用户未使用可用的ACS身份提供程序之一登录,则该主页应返回unauthorized(未经授权)。类似地,我希望将一些Web API ApiController方法保留为公共,并要求对其他方法进行授权

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

我觉得我很接近,但可能错过了一些重要的东西,但我似乎在网上找不到。有人能帮我纠正一下吗

谢谢,
Alex

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

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

看看多米尼克·拜尔的


同样无耻。

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

是的,当您访问MVC路由时,SWTModule将拦截解释其失败原因的所有调用。该模块不知道任何关于Authorize属性的信息。如果您想让它工作,最好按照Aliostad的建议并使用DelegatingHandler。如果您想“简单”现在就让它工作吧,您可以检查模块中请求的执行路径,以便它只检查api的路径(请注意,这对公共api方法不起作用,因为模块不知道这些属性)

是的,使用两个单独的项目也可以工作,因为该模块将只应用于添加了该模块的项目


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

好的……这很有道理,我觉得我用了错误的部分来做我想做的事情,谢谢,我会尝试一下ThinkTecture的文章。谢谢,如果你是第一个,我会给你答案的,但我投票支持你,因为你为我破译了一些错误的想法,并且很好地理解了上下文……谢谢,我想我可以现在不要这样。