【问题标题】:Asp.Net MVC with Web Api带有 Web Api 的 Asp.Net MVC
【发布时间】:2014-07-10 13:37:52
【问题描述】:

我正在寻找一种使用 Web Api(2) 和 Asp.net MVC(5) 来实现 Intranet Web 应用程序的好方法。 应用程序的设计方式是,我们在客户端使用 AngularJS SPA,在服务器端 MVC 中使用 Web Api 作为单个应用程序/网站。 MVC 是因为我们必须根据安全权限来限制操作。如果用户没有权限,当我们为视图调用 MVC 控制器时,我们不会渲染操作按钮(例如,保存、删除等)。其他操作是利用 Web API 方法来保存、删除等,

基本思路是

MVC 控制器用于在用户没有权限的情况下生成删除操作按钮的视图(AngularJS 的 html 模板)。 数据操作是通过 Web API(AngularJS $http 服务 web api 调用)

这里有问题

我们如何派生一种可用于 MVC 和 Web API 的身份验证机制? (我们可以创建身份验证过滤器,但我们必须为 MVC 和 Web API 创建单独的过滤器,对吧?)

一旦用户通过身份验证,我们如何与 MVC 控制器和 Web Api 控制器共享此信息,而不是验证用户来自 Angular js 的每个请求?

是否可以对 MVC 和 WebApi 使用 ASP.Net 表单身份验证进行身份验证?如果是这样,我们该怎么做?是否会使用 [authorize] 属性自动为 MVC 控制器和 Web Api 控制器验证表单身份验证令牌?

我还想知道,在单个应用程序中混合 MVC 和 WebApi 是一种好方法吗?

【问题讨论】:

  • 所以您不想使用内置身份验证(例如,身份与帐户/角色然后使用AuthorizeAttribute)?
  • 是的,我们可以,但我们需要为 MVC 和 Web API 分别处理它,对吧?
  • 您的 Web API 是否位于与 MVC 网站不同的服务器/项目中?
  • Web API 和 MVC 在单个应用程序中
  • 如果它们在同一个应用程序中,它们已经共享相同的上下文(Http/Owin)并且可以通过相同的方式进行身份验证。授权过滤器位于 Mvc/WebApi 的不同命名空间中,但它们的工作方式相同。在任何情况下,您都可以创建自己的授权过滤器并实现 MVC 和 WebApi 的接口(System.Web.Mvc 和 System.Web.Http.Filters 中的 IAuthorizationFilter)来集中您的自定义逻辑。

标签: asp.net asp.net-mvc angularjs asp.net-web-api


【解决方案1】:

这是一个可行的选择,但不是推荐的选择。

由于 WebApi 操作将继承自 ApiController

并且 MVC 控制器操作将从控制器类继承。

如果你想为 api 和 mvc 控制器定义路由,那么你需要在 Global.ascx 中像这样注册路由

应用启动

GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);  

RouteConfig 类

    public static class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {   

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

WebApiConfig 类

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // TODO: Add any additional configuration code.

            // Web API routes
            config.MapHttpAttributeRoutes();
            config.Formatters.XmlFormatter.UseXmlSerializer = true;

            config.MessageHandlers.Add(new YourMessageHandlers());

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

【讨论】:

    猜你喜欢
    • 2012-04-07
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多