【问题标题】:Maintain session in subsequent request in WEB API for OTP verification在 WEB API 的后续请求中维护会话以进行 OTP 验证
【发布时间】:2018-09-28 16:43:10
【问题描述】:

我正在开发一个 MVC 应用程序,其中也有单独的 WEB API 项目。 现在我想通过 WEB API 实现基于移动端 OTP 验证的更新电子邮件功能。 Web API 是无状态的,但我仍然想在我的代码中实现 SESSION,以便我可以访问子序列请求中的 OTP 值并对其进行验证。目前,我可以在第一个请求中将 OTP 存储在会话中,但在下一个请求中,会话为空,我无法访问存储的 OTP 值。

我不希望数据库之旅来存储和检索 OTP。

public HttpResponseMessage SendOtpOnMobile([FromBody]OtpOnMobileAPIRequest objOtpOnMobileAPIRequest)
{            
    otpValue = CommonUtility.GenerateRandomOTP(4);
    HttpContext.Current.Session["otpGeneratedValue"] = otpValue;
    //Send OTP logic and response code
    ....
}

public HttpResponseMessage ValidateOtpFromMobile([FromBody]ValidateOtpFromMobileAPIRequest objValidateOtpFromMobileAPIRequest)
{
    var otpGeneratedValue = HttpContext.Current.Session["otpGeneratedValue"];
    if(objValidateOtpFromMobileAPIRequest.OTP == otpGeneratedValue)
    {
        //success
    }
    ....
}

我尝试了以下网址。

ASP.NET Web API session or something?

Accessing Session Using ASP.NET Web API

【问题讨论】:

  • 通常,OTP 在几分钟内有效,因此不要依赖会话存储(这打破了纯无状态的 Rest API 概念)将值存储在持久性存储中(如 SQL 或 Azure 表等)打破了会话的紧密依赖。

标签: c# asp.net-mvc session asp.net-web-api asp.net-web-api2


【解决方案1】:

您想要做什么和可以实现什么是两件不同的事情。

对 API 的每次调用都是离散的,不会跟踪以前的请求。但是,由于您也有一个 MVC 应用程序,因此我建议您在那里维护会话,并简单地将您想要的任何内容作为参数传递给 API。

因此,如果可以的话,将您生成的 OTP 代码返回到您的 MVC 应用程序,并将其存储在会话中,然后在后续的 API 请求中,从您的网络应用程序传递它。

如果您描述了应用程序的流程会有所帮助,因为建议将基于此。

如果您有多个客户端使用您的 API,那么每个客户端都必须维护正常运行所需的数据,或者您需要进行额外的数据库访问。哪种解决方案更适合您的特定场景取决于您。

【讨论】:

  • 感谢@andrei-dragotoniu 的回复。是的,我可以在我的 MVC 应用程序中管理它。但移动团队也使用相同的 API。我已经公开了适用于 android 和 iOS 应用程序的 API。
【解决方案2】:

您知道“API 是无状态的”真是太好了。我完全同意安德烈的话

你想做什么和可以实现什么是两件不同的事情。

如果您不想将 OTP 存储在数据库中,那么为什么不在 HttpRequestHeader 中传递 OTP。

在您的标头中传递 OTP(首选加密的 OTP,然后在您的 WEB API 中解密。

根据您的需要建议这种方式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-17
    • 2014-03-05
    • 1970-01-01
    • 2017-03-24
    • 2013-11-25
    • 2011-07-21
    • 2019-03-03
    相关资源
    最近更新 更多