【问题标题】:Retrieving and persisting state across requests跨请求检索和持久化状态
【发布时间】:2016-02-29 21:34:09
【问题描述】:

我正在编写我的第一个 ASP.NET Web API 应用程序。我熟悉其他 Web 应用程序框架(主要是 Symfony,但也熟悉 Django,以及在较小程度上的 RoR)。

我有点挣扎,以了解从浏览器/前端客户端向 Web 服务器发送请求后发生的事件顺序。

我正在编写一个使用数据库后端的多租户应用程序。我正在使用 ADO 和原始 SQL 来访问数据库,我还需要为每个用户存储大量信息,因此基本上,我为用户创建(或从缓存中获取)预加载的上下文。

这里有一些伪代码,说明了我在 ASP.NET 中想要实现的目标。

namespace myApp.Controllers
{
    public class FoobarController : ApiController
    {
        public Response doLogin(request)
        {
             var ctx = myApplicationContext.getInstance();
             var user = ctx.getUser();     

             if (!user.isLoggedOn())
             {
                 username = request.getParameter('username');
                 password= request.getParameter('password');

                 dbManager = ctx.getDbInstance();

                 resp = dbManager.internalLogin(username, password);

                 // Load permissions etc for current user, from db
                 // Store user info in cache ..
             }
        }       

        public Response ActionOne(request)
        {
             ctx = myApplicationContext.getInstance();
             user = ctx.getUser();

             if (user.hasPermission('xxx'))
             {

             }
        }
    }
}

我的问题是,我该如何实现这种功能:

即:

  • 创建一个应用程序上下文,我可以在其中填充上下文敏感信息,如数据库连接、邮件配置、对象工厂、各种状态信息等。

  • 访问用户对象(我可以添加用户凭据、权限等)

  • 有权访问会话变量等?

注意事项

  1. 我将在 Linux 上部署 Web 应用程序,并将使用 Apache 作为 Web 服务器。
  2. 出于本项目的目的,我不想使用任何 Microsoft 技术,如 Azure、Windows 身份验证等(C# 和 ASP.Net 除外)
  3. 我想使用原始数据库连接,而不是使用实体管理器(旧应用程序端口)

【问题讨论】:

  • 您研究过 OWIN 和 ASP 身份吗?如今,身份与 OWIN 一样,随 ASP 应用程序的模板一起提供,它将处理您所有的身份验证需求。 OWIN 是一个更基本的框架,其他所有东西(理论上)都位于该框架上——如果您想构建自己的身份验证框架只是为了学习,我会从 OWIN 开始。 ASP.net 网站上有一些教程。

标签: asp.net asp.net-web-api asp.net-web-api2


【解决方案1】:

我有点挣扎,以了解从浏览器/前端客户端向 Web 服务器发送请求后发生的事件顺序。

为此,我想说this PDF Poster 提供了 ASP.NET WebAPI 中请求处理的最佳图示。

我的问题是,我该如何实现这种功能:

即:

  • 创建一个应用程序上下文,我可以在其中填充上下文 敏感信息,如数据库连接、邮件程序 配置、对象工厂、各种状态信息等

  • 访问用户对象(我可以添加用户凭据、权限等)

  • 有权访问会话变量等?

为此,我想说,WebAPI 被设计为无状态,因此,最好的方法是创建一个持久会话(例如在数据库中)并为每个请求使用会话标识符(如会话密钥或令牌)来识别一个用户并获取他的会话变量/上下文信息。

现在,为了实现您在示例中要求的那种功能,可以通过 Authentication Filters 和 Authorization Filters(More details on implementing them here) 的组合来实现。

WebAPI 中的每个请求首先由处理程序处理,然后在执行请求的操作之前应用过滤器。对于您的示例,身份验证过滤器将保存 DoLogin 函数,user.hasPermission 逻辑将驻留在授权过滤器中,并且只有操作逻辑将驻留在控制器的 Action(function) 中。

【讨论】:

  • 感谢您的回答。但是,我已经知道那个 pdf 示意图。不幸的是,它并没有太大帮助,因为它假设读者已经熟悉 ASP.Net 类/命名空间等。我正在寻找的是一个将工作流中的概念映射到框架类的图表 - 就目前而言的图表,看起来在工程恕我直言。如果做不到这一切,至少看看我如何编写自己的身份验证和授权过滤器会很有用。
  • 说真的,这也是我第一眼看到的图表。但是一旦我对 webAPI 有了基本的了解,这个结果将成为我自己需要的任何澄清的一站式点。此链接提供了实现授权和身份验证的更多详细信息。我也会在我的答案中更新这个。 - asp.net/web-api/overview/security/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
相关资源
最近更新 更多