Esempio n. 1
0
    private async Task <TblIdentityCredential> ValidatePassword(AuthenticateCredentialQuery request, AuthorizeBy authorizeBy, TblIdentityCredential credential, CancellationToken cancellationToken)
    {
        if (authorizeBy == AuthorizeBy.Token)
        {
            return(credential);
        }

        var hashPassword = Encoding.ASCII.GetString(credential.PasswordByte);

        return(!BCrypt.Net.BCrypt.Verify(request.Password, hashPassword) ? null : credential);
    }
Esempio n. 2
0
    public async Task <QueryResponse <AuthorizeIdentityResponse> > Handle(AuthenticateCredentialQuery request, CancellationToken cancellationToken)
    {
        var credential = await ValidateAuthorization(request, cancellationToken, request.AuthorizeBy);

        if (credential == null)
        {
            return(new()
            {
                Message = $"Identity does not exist",
                HttpStatusCode = HttpStatusCode.NotFound
            });
        }

        var cuid = new Guid(credential.Guid);

        credential = await ValidatePassword(request, request.AuthorizeBy, credential, cancellationToken);

        if (credential == null)
        {
            //_recordsService.NewAuthorizationLog(AuthenticationState.WrongPassword, cuid);
            return(new()
            {
                Message = $"Identity Authentication Failed",
                HttpStatusCode = HttpStatusCode.BadRequest
            });
        }

        var roleList = await GetRoleList(cancellationToken, credential, cuid);

        var token = await _jwtService.GenerateToken(request.Username, cuid, roleList.Select(i => i.RoleEntityId).Adapt <List <RoleEntity> >());

        //_recordsService.NewAuthorizationLog(AuthenticationState.Success, cuid);

        return(new()
        {
            Message = $"Identity Authorized",
            HttpStatusCode = HttpStatusCode.Accepted,
            Response = new()
            {
                AccessToken = token.AccessToken,
                RefreshToken = token.RefreshToken,
                IdentityGuid = Guid.Parse(credential.IdentityInfo.Guid),
                CredentialGuid = Guid.Parse(credential.Guid),
                RoleList = roleList.Adapt <List <RoleResponse> >()
            }
        });
    }
Esempio n. 3
0
    private async Task <TblIdentityCredential> ValidateAuthorization(AuthenticateCredentialQuery request, CancellationToken cancellationToken, AuthorizeBy authorizeBy)
    {
        TblIdentityCredential result;

reAuth:
        switch (authorizeBy)
        {
        case AuthorizeBy.Default:
            var application = await GetApplication(request.RequestServer.ApplicationId);

            var getDefaults = await _dataLayer.TblConfigurations
                              .AsNoTracking()
                              .FirstOrDefaultAsync(i => i.ApplicationId == application.Id & i.Key == "DefaultAuthorizeBy", cancellationToken: cancellationToken);

            if (getDefaults is null)
            {
                throw new ArgumentException($"Unable to login: Application with Guid '{application.Guid}' does not have 'DefaultAuthorizeBy' key in registry");
            }
            authorizeBy = (AuthorizeBy)int.Parse(getDefaults.Value);
            goto reAuth;

        case AuthorizeBy.UsernameEmailPhone:
            result = await _dataLayer.TblIdentityCredentials
                     .Include(i => i.IdentityInfo)
                     .AsNoTracking()
                     .FirstOrDefaultAsync(i => i.UserName == request.Username,
                                          cancellationToken: cancellationToken);

            result ??= _dataLayer.TblIdentityContacts
            .Include(i => i.UserCredential)
            .ThenInclude(i => i.IdentityInfo)
            .AsNoTracking()
            .FirstOrDefault(i => i.Value == request.Username & i.UcentitiesId == (long?)GenericContactType.Email)?.UserCredential;
            result ??= _dataLayer.TblIdentityContacts
            .Include(i => i.UserCredential)
            .ThenInclude(i => i.IdentityInfo)
            .AsNoTracking()
            .FirstOrDefault(i => i.Value == request.Username & i.UcentitiesId == (long?)GenericContactType.Phone)?.UserCredential;
            break;

        case AuthorizeBy.Username:
            result = await _dataLayer.TblIdentityCredentials
                     .Include(i => i.IdentityInfo)
                     .AsNoTracking()
                     .FirstOrDefaultAsync(i => i.UserName == request.Username,
                                          cancellationToken: cancellationToken);

            break;

        case AuthorizeBy.Email:
            request.Username.ValidateEmailAddress();
            result = _dataLayer.TblIdentityContacts
                     .Include(i => i.UserCredential)
                     .ThenInclude(i => i.IdentityInfo)
                     .AsNoTracking()
                     .FirstOrDefault(i => i.Value == request.Username & i.UcentitiesId == 1)?.UserCredential;
            break;

        case AuthorizeBy.Phone:
            result = _dataLayer.TblIdentityContacts
                     .Include(i => i.UserCredential)
                     .ThenInclude(i => i.IdentityInfo)
                     .AsNoTracking()
                     .FirstOrDefault(i => i.Value == request.Username.ValidatePhoneNumber(false) & i.UcentitiesId == 2)?.UserCredential;
            break;

        case AuthorizeBy.Token:
            result = await _dataLayer.TblIdentityCredentials
                     .Include(i => i.IdentityInfo)
                     .AsNoTracking()
                     .FirstOrDefaultAsync(i => i.UserName == request.Username,
                                          cancellationToken: cancellationToken);

            break;

        default:
            throw new ArgumentOutOfRangeException();
        }

        return(result);
    }
Esempio n. 4
0
    public virtual async Task <JsonResult> Authenticate([FromBody] AuthenticateCredentialQuery request)
    {
        var result = await _mediator.Send(request);

        return(new JsonResult(result));
    }