Ejemplo n.º 1
0
        public AuthenticationModule(ICommandDispatcher commandDispatcher,
                                    IValidatorResolver validatorResolver,
                                    IIdentityProvider identityProvider,
                                    IUserStorage userStorage,
                                    IOperationStorage operationStorage,
                                    IJwtTokenHandler jwtTokenHandler,
                                    JwtTokenSettings jwtTokenSettings)
            : base(commandDispatcher, validatorResolver, identityProvider, modulePath: "")
        {
            Post("sign-in", async(ctx, p) => await For <SignIn>()
                 .Set(c =>
            {
                c.IpAddress = Request.UserHostAddress;
                c.UserAgent = Request.Headers.UserAgent;
            })
                 .SetResourceId(c => c.SessionId)
                 .OnSuccess(async c =>
            {
                var operation = await operationStorage.GetUpdatedAsync(c.Request.Id);
                if (operation.HasNoValue || !operation.Value.Success)
                {
                    return(HttpStatusCode.Unauthorized);
                }

                var session = await userStorage.GetSessionAsync(c.SessionId);
                if (session.HasNoValue)
                {
                    return(HttpStatusCode.Unauthorized);
                }

                return(new
                {
                    token = jwtTokenHandler.Create(session.Value.UserId),
                    sessionId = session.Value.Id,
                    sessionKey = session.Value.Key,
                    expiry = DateTime.UtcNow.AddDays(jwtTokenSettings.ExpiryDays).ToTimestamp()
                });
            })
                 .DispatchAsync());

            Post("sign-up", async args => await For <SignUp>()
                 .OnSuccessAccepted("account")
                 .DispatchAsync());

            Post("sign-out", async args => await For <SignOut>()
                 .OnSuccess(HttpStatusCode.NoContent)
                 .DispatchAsync());
        }