我正在 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 的不同位置。
我觉得我很接近但可能错过了一些重要的东西,但我似乎没有在网上找到它。有人会理我吗?
谢谢,亚历克斯