从Web API发送电子邮件而不暴露服务IP / URL

时间:2016-06-20 06:44:17

标签: asp.net-mvc email security azure

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

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

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

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

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

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

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

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

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

    注意事项:

    • Web API将使用SendGrid发送邮件

    • 系统(MVC和Web API)将托管在Azure中(我提到这个 当Azure扩展出来时,知道上面第一种方法中的任何陷阱 系统)。

    由于

1 个答案:

答案 0 :(得分:0)

我不明白这种困惑。无论如何,您永远不会将用户直接链接到Web Api。从本质上讲,MVC项目在这种情况下只是围绕Web Api的UI,例如:

  1. 用户在MVC网站上加载“注册”页面并将表单提交给MVC网站上的操作
  2. MVC网站的帖子操作呼叫Web Api注册用户并发送确认电子邮件。然后,将用户重定向到MVC站点上的另一个页面。
  3. Web Api会向用户发送确认电子邮件,其中包含确认MVC网站上的链接
  4. 用户点击电子邮件中的链接,然后转到MVC网站上的确认页面。
  5. MVC网站再次与Web Api交互以确认用户,并将用户重定向到MVC网站上的另一个页面。
  6. 正如您所看到的,上面没有任何一点是用户甚至意识到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进行交互,然后您可以使用依赖注入框架为WebApiService注入IService。然后,如果由于某种原因,您稍后需要直接切换到使用Entity Framework,您可以创建类似的内容:

    public class EntityFrameworkService : IService
    

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