【问题标题】:Sending emails from Web API without exposing service IP/URL从 Web API 发送电子邮件而不暴露服务 IP/URL
【发布时间】:2016-06-20 06:44:16
【问题描述】:

我正在开发一个提供帐户管理功能的应用程序。实施方面,它有一个用于 UI 的 MVC 应用程序和独立几个用于业务逻辑的 Web API 服务。

我需要在以下几种情况下管理向用户发送邮件

  • 用户创建帐户,Web API 发送确认/激活邮件

  • 用户忘记密码,Web API 发送重置链接

现在的问题是,如何在不暴露 Web API 主机 IP(或 URL)的情况下向用户发送邮件?也许,我可以做到以下几点:

  1. 在 MVC 中创建一个操作,调用该操作时,将信息发送到 适当的 Web API 控制器方法

  2. 使用适当的参数,将上述动作作为href包含在Web API发送的邮件中

另一种方法可能是,只需将代码发送给不带链接的用户,并要求用户在 UI 上输入该令牌(用户知道 MVC UI 链接)。

我更喜欢第二种方法。这是正确的方法吗?还有其他更好的方法吗?

注意事项:

  • Web API 将使用 SendGrid 发送邮件

  • 系统(MVC 和 Web API)将托管在 Azure 中(我提到这一点是为了 当 Azure 向外扩展时,了解上述第一种方法中的任何陷阱 系统)。

谢谢

【问题讨论】:

    标签: asp.net-mvc email security azure


    【解决方案1】:

    我不明白这种混乱。无论如何,您永远不会将用户直接链接到 Web Api。本质上,MVC 项目在这个场景中只是变成了围绕 Web Api 的 UI,例如:

    1. 用户在 MVC 站点上加载“注册”页面并将表单提交到 MVC 站点上的操作
    2. MVC 站点的 post 操作调用 Web Api 来注册用户并发送确认电子邮件。然后,将用户重定向到 MVC 站点上的另一个页面。
    3. Web Api 向用户发送确认电子邮件,其中包含用于确认MVC 站点的链接。
    4. 用户单击电子邮件中的链接,并被带到 MVC 站点上的确认页面。
    5. MVC 站点再次与 Web Api 交互以确认用户,并将用户重定向到 MVC 站点上的另一个页面。

    如您所见,在上面的任何一点上,用户都没有意识到 Web Api 组件的存在。他们唯一的互动是与 MVC 网站。

    现在,我会更进一步,说 MVC 站点不应该知道它正在使用 Web Api,或者。本质上,它只是像使用数据库一样使用 Web Api。它只知道它需要执行一些恰好由 Web Api 完成的功能。因此,您应该将 Web Api 调用包装到一个服务类中,实现一个接口。例如:

    public interface IService
    
    public class WebApiService : IService
    

    IService 上,您将定义服务客户端可以执行的所有操作。 RegisterUserSendConfirmationEmailConfirmUser 等。然后,在 WebApiService 上,您将使用您的 Web Api 来实现这些方法。但是,您的 MVC 站点应该只与IService 交互,然后您可以使用依赖注入框架为IService 注入WebApiService。然后,如果由于某种原因,您以后需要直接切换到使用 Entity Framework,例如,您可以创建如下内容:

    public class EntityFrameworkService : IService
    

    然后,然后注入它。由于 MVC 应用程序只知道 IService,因此您根本不需要更改任何内容。

    【讨论】:

    • 正如我在问题中提到的,我的 Web API 服务是独立的项目并且独立托管。 UI 可以作为 AJAX 请求或传统的 MVC 样式与这些服务交互,具体取决于业务功能。因此,当 API 发送邮件时,它不能包含指向 MVC 应用程序的链接,因为我不希望 API 了解 MVC 操作。仔细想想,第二种方法似乎很难看,尤其是帐户创建场景。这样,UI 需要有 3 个链接:“登录”、“注册”和“确认帐户”;最后一个链接很奇怪。有什么想法吗?
    • 首先,它是独立托管的这一事实是无关紧要的。如果您不希望它了解 MVC 应用程序,只需将要包含在电子邮件中的链接作为 API 的一部分,以便 MVC 应用程序将其传递给 Web Api。此外,我们不是在这里谈论链接。你想得太字面意思了。这些是 MVC 应用程序将进行的方法调用。在类似“注册”的情况下,RegisterUserSendConfirmationEmail 都将出现在同一个操作中。我只是在这里分解它,因为它可能是单独的 Web Api 操作。
    • 我认为你是对的。在进行调用时,UI 可以将其链接发送到 Web API。当负载平衡器出现时,这是一个问题,但这很好。鉴于其他事实,这种方法是有道理的。我很傻;谢谢。
    • 负载均衡器不会影响任何事情,除非您将用户发送到裸 IP。即使这样,如果正确设置了负载平衡,它可能也不会成为问题。否则,无论实际服务器响应的是什么,它都会访问相同的 URL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    相关资源
    最近更新 更多