-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathLogin.cs
More file actions
54 lines (50 loc) · 2.29 KB
/
Copy pathLogin.cs
File metadata and controls
54 lines (50 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using Asp.Versioning;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using OpenShock.API.Models.Requests;
using OpenShock.API.Services.Account;
using OpenShock.Common.Errors;
using OpenShock.Common.Models;
using OpenShock.Common.Options;
using OpenShock.Common.Problems;
using OpenShock.Common.Utils;
using System.Net.Mime;
using Microsoft.AspNetCore.RateLimiting;
namespace OpenShock.API.Controller.Account;
public sealed partial class AccountController
{
/// <summary>
/// Authenticate a user
/// </summary>
/// <response code="200">User successfully logged in</response>
/// <response code="401">Invalid username or password</response>
[HttpPost("login")]
[EnableRateLimiting("auth")]
[ProducesResponseType<LegacyEmptyResponse>(StatusCodes.Status200OK, MediaTypeNames.Application.Json)]
[ProducesResponseType<OpenShockProblem>(StatusCodes.Status401Unauthorized, MediaTypeNames.Application.ProblemJson)] // InvalidCredentials
[ProducesResponseType<OpenShockProblem>(StatusCodes.Status403Forbidden, MediaTypeNames.Application.ProblemJson)] // InvalidDomain
[MapToApiVersion("1")]
public async Task<IActionResult> Login(
[FromBody] Login body,
[FromServices] IOptions<FrontendOptions> options,
CancellationToken cancellationToken)
{
var cookieDomainToUse = options.Value.CookieDomain.Split(',').FirstOrDefault(domain => Request.Headers.Host.ToString().EndsWith(domain, StringComparison.OrdinalIgnoreCase));
if (cookieDomainToUse is null) return Problem(LoginError.InvalidDomain);
var loginAction = await _accountService.CreateUserLoginSessionAsync(body.Email, body.Password, new LoginContext
{
Ip = HttpContext.GetRemoteIP().ToString(),
UserAgent = HttpContext.GetUserAgent(),
}, cancellationToken);
return loginAction.Match<IActionResult>(
ok =>
{
HttpContext.SetSessionKeyCookie(loginAction.AsT0.Value, "." + cookieDomainToUse);
return LegacyEmptyOk("Successfully logged in");
},
notActivated => Problem(AccountError.AccountNotActivated),
deactivated => Problem(AccountError.AccountDeactivated),
notFound => Problem(LoginError.InvalidCredentials)
);
}
}