From 90678f2b4fd51e6e0ce118c2e51049b9265ac8e3 Mon Sep 17 00:00:00 2001 From: Denis Prokhorchik Date: Sun, 16 Jan 2022 22:14:40 +0300 Subject: [PATCH 1/2] feat(issue-161): add the e-sender feature to gateway of web version --- .../Features/Auth/AuthController.cs | 46 +++++++++++++++++++ .../Features/Auth/Models/AuthInfoModel.cs | 7 +++ 2 files changed, 53 insertions(+) create mode 100644 src/ApiGateways/O2NextGen.Web.BFF.Core/O2NextGen.Web.BFF.Core/Features/Auth/AuthController.cs create mode 100644 src/ApiGateways/O2NextGen.Web.BFF.Core/O2NextGen.Web.BFF.Core/Features/Auth/Models/AuthInfoModel.cs diff --git a/src/ApiGateways/O2NextGen.Web.BFF.Core/O2NextGen.Web.BFF.Core/Features/Auth/AuthController.cs b/src/ApiGateways/O2NextGen.Web.BFF.Core/O2NextGen.Web.BFF.Core/Features/Auth/AuthController.cs new file mode 100644 index 00000000..14d8b577 --- /dev/null +++ b/src/ApiGateways/O2NextGen.Web.BFF.Core/O2NextGen.Web.BFF.Core/Features/Auth/AuthController.cs @@ -0,0 +1,46 @@ +using Microsoft.AspNetCore.Antiforgery; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using O2NextGen.Web.BFF.Core.Features.Auth.Models; + +namespace O2NextGen.Web.BFF.Core.Features.Auth +{ + [Route("auth")] + public class AuthController : ControllerBase + { + private readonly IAntiforgery _antiForgery; + + public AuthController(IAntiforgery antiForgery) + { + _antiForgery = antiForgery; + } + + [HttpGet] + [Route("info")] + public ActionResult GetInfo() + { + var tokens = _antiForgery.GetAndStoreTokens(HttpContext); + HttpContext.Response.Cookies.Append( + "XSRF-TOKEN", + tokens.RequestToken, + //allow JS to grab the cookie to put it in the request header + new CookieOptions() {HttpOnly = false}); + + return new AuthInfoModel + { + Name = User.FindFirst("name").Value + }; + } + + /* + * No need to do anything here, as the auth middleware will take care of redirecting to IdentityServer4. + * When the user is authenticated and gets back here, we can redirect to the desired url. + */ + [HttpGet] + [Route("login")] + public IActionResult Login([FromQuery] string returnUrl) + { + return Redirect(string.IsNullOrWhiteSpace(returnUrl) ? "/" : returnUrl); + } + } +} \ No newline at end of file diff --git a/src/ApiGateways/O2NextGen.Web.BFF.Core/O2NextGen.Web.BFF.Core/Features/Auth/Models/AuthInfoModel.cs b/src/ApiGateways/O2NextGen.Web.BFF.Core/O2NextGen.Web.BFF.Core/Features/Auth/Models/AuthInfoModel.cs new file mode 100644 index 00000000..3a701eb6 --- /dev/null +++ b/src/ApiGateways/O2NextGen.Web.BFF.Core/O2NextGen.Web.BFF.Core/Features/Auth/Models/AuthInfoModel.cs @@ -0,0 +1,7 @@ +namespace O2NextGen.Web.BFF.Core.Features.Auth.Models +{ + public class AuthInfoModel + { + public string Name { get; set; } + } +} \ No newline at end of file From 4f9b8ded80159405a9d0f7608e2a1f24d79951a5 Mon Sep 17 00:00:00 2001 From: Denis Prokhorchik Date: Tue, 18 Jan 2022 04:22:21 +0300 Subject: [PATCH 2/2] feat(issue-161): add feature e-sender service to o2-auth --- .../Services/ESenderService.cs | 36 +++++++++++++++++ .../Services/MailRequestViewModel.cs | 11 ++++++ .../O2NextGen.Auth.Web/Services/UrlsConfig.cs | 7 ++++ .../auth/O2NextGen.Auth.Web/Startup.cs | 39 +++++++++++++++++-- .../auth/O2NextGen.Auth.Web/appsettings.json | 5 ++- 5 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 src/Services/auth/O2NextGen.Auth.Web/Services/ESenderService.cs create mode 100644 src/Services/auth/O2NextGen.Auth.Web/Services/MailRequestViewModel.cs create mode 100644 src/Services/auth/O2NextGen.Auth.Web/Services/UrlsConfig.cs diff --git a/src/Services/auth/O2NextGen.Auth.Web/Services/ESenderService.cs b/src/Services/auth/O2NextGen.Auth.Web/Services/ESenderService.cs new file mode 100644 index 00000000..379dbaf0 --- /dev/null +++ b/src/Services/auth/O2NextGen.Auth.Web/Services/ESenderService.cs @@ -0,0 +1,36 @@ +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Options; + +namespace O2NextGen.Auth.Web.Services +{ + public interface IESenderService + { + Task Send(string email, string subject, string htmlMessage); + } + public class ESenderService: IESenderService + { + private readonly HttpClient _httpClient; + private readonly IOptions _config; + + public ESenderService(HttpClient httpClient, IOptions config) + { + _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient)); + _config = config ?? throw new ArgumentNullException(nameof(config)); + } + + public async Task Send(string email, string subject, string htmlMessage) + { + var model = new MailRequestViewModel() + { + Subject = subject, + To = email, + Body = htmlMessage + }; + var response = await _httpClient.PostAsJsonAsync("api/emailsender",model,CancellationToken.None); + await response.Content.ReadAsAsync(CancellationToken.None); + } + } +} \ No newline at end of file diff --git a/src/Services/auth/O2NextGen.Auth.Web/Services/MailRequestViewModel.cs b/src/Services/auth/O2NextGen.Auth.Web/Services/MailRequestViewModel.cs new file mode 100644 index 00000000..cfec78f5 --- /dev/null +++ b/src/Services/auth/O2NextGen.Auth.Web/Services/MailRequestViewModel.cs @@ -0,0 +1,11 @@ +namespace O2NextGen.Auth.Web.Services +{ + public class MailRequestViewModel + { + public long Id { get; set; } + public string From { get; set; } + public string To { get; set; } + public string Body { get; set; } + public string Subject { get; set; } + } +} \ No newline at end of file diff --git a/src/Services/auth/O2NextGen.Auth.Web/Services/UrlsConfig.cs b/src/Services/auth/O2NextGen.Auth.Web/Services/UrlsConfig.cs new file mode 100644 index 00000000..1fe6a290 --- /dev/null +++ b/src/Services/auth/O2NextGen.Auth.Web/Services/UrlsConfig.cs @@ -0,0 +1,7 @@ +namespace O2NextGen.Auth.Web.Services +{ + public class UrlsConfig + { + public string ESenderUrl { get; set; } + } +} \ No newline at end of file diff --git a/src/Services/auth/O2NextGen.Auth.Web/Startup.cs b/src/Services/auth/O2NextGen.Auth.Web/Startup.cs index 56f8299b..e2ce157e 100644 --- a/src/Services/auth/O2NextGen.Auth.Web/Startup.cs +++ b/src/Services/auth/O2NextGen.Auth.Web/Startup.cs @@ -1,21 +1,31 @@ -using System.Text.Encodings.Web; +using System; +using System.Text.Encodings.Web; using System.Threading.Tasks; using System.Web; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.UI.Services; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using O2NextGen.Auth.Web.Data; using O2NextGen.Auth.Web.Extensions; +using O2NextGen.Auth.Web.Services; namespace O2NextGen.Auth.Web { public class Startup { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { @@ -29,8 +39,9 @@ public void ConfigureServices(IServiceCollection services) .AddEntityFrameworkStores() .AddDefaultTokenProviders(); - + services.AddApplicationServices(Configuration); services.AddSingleton(); + } public void Configure(IApplicationBuilder app, IHostingEnvironment env) @@ -46,22 +57,44 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) app.UseRequestLocalization(v); app.UseAuthentication(); app.UseMvcWithDefaultRoute(); + } } + public static class ServiceCollectionExtensions + { + public static IServiceCollection AddApplicationServices(this IServiceCollection services,IConfiguration configuration) + { + //register delegating handlers + // services.AddTransient(); + services.AddSingleton(); + + //register http services + services + .AddHttpClient("E-Sender", client => + { + client.BaseAddress = new Uri(configuration.GetValue("urls:ESenderUrl")); + }); + + return services; + } + } internal class DummyEmailSender : IEmailSender { private readonly ILogger _logger; + private readonly IESenderService _service; - public DummyEmailSender(ILogger logger) + public DummyEmailSender(ILogger logger, IESenderService service) { _logger = logger; + _service = service; } public Task SendEmailAsync(string email, string subject, string htmlMessage) { _logger.LogWarning("EmailSender implementation is being used!!!!"); _logger.LogWarning($"htmlMessage = { HttpUtility.HtmlDecode(htmlMessage)}"); + _service.Send(email,subject,htmlMessage); return Task.CompletedTask; } } diff --git a/src/Services/auth/O2NextGen.Auth.Web/appsettings.json b/src/Services/auth/O2NextGen.Auth.Web/appsettings.json index 905fcee1..5b50742f 100644 --- a/src/Services/auth/O2NextGen.Auth.Web/appsettings.json +++ b/src/Services/auth/O2NextGen.Auth.Web/appsettings.json @@ -24,5 +24,8 @@ "Microsoft.Hosting.Lifetime": "Information" } }, - "AllowedHosts": "*" + "AllowedHosts": "*", + "urls": { + "ESenderUrl": "https://e-sender" + } }