コード例 #1
0
 public int CreateAuditActivityLog(AuditActivityLog auditLog)
 {
     _repositoryBase.Add(auditLog);
     return(auditLog.Id);
 }
コード例 #2
0
        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            using (var unitOfWork = new UnitOfWorkFactory().Create())
            {
                string requestIPAddress = GetIpAddress();

                var auditLog = new AuditActivityLog()
                {
                    SenderUserID     = context.UserName,
                    SenderRequestURL = HttpContext.Current.Request.Url.OriginalString,
                    SenderIP         = requestIPAddress,
                    AuditDateTime    = DateTime.Now
                };
                var auditId = unitOfWork.AuditRepository.CreateAuditActivityLog(auditLog);
                unitOfWork.Commit();

                try
                {
                    context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

                    var clientUser = unitOfWork.UserRepository.GetUserByName(x => x, context.UserName,
                                                                             new List <Expression <Func <ClientUser, object> > > {
                        x => x.Client,
                        x => x.UserIPAddresses
                    });
                    if (clientUser == null || !(await unitOfWork.UserRepository.IsPasswordValidAsync(clientUser, context.Password)))
                    {
                        throw new AuthenticationException("The user name or password is incorrect.");
                    }

                    auditLog.LoginUser    = clientUser;
                    auditLog.InsightEmail = clientUser.Email;

                    if (!clientUser.Active)
                    {
                        throw new AuthenticationException("The user account is disabled.");
                    }
                    if (clientUser.Client == null)
                    {
                        throw new AuthenticationException("The user account doesn't have a client associated with it.");
                    }

                    DateTime nowDateTime = DateTime.UtcNow;

                    //Check whitelisting of IP addresses
                    if (clientUser.Client.WhitelistIPs)
                    {
                        List <ClientIPAddresses> userIPWhiteList = clientUser.UserIPAddresses == null ? null : clientUser.UserIPAddresses.Where(x => (x.IPAddress4 == requestIPAddress)).ToList();
                        if (userIPWhiteList == null || userIPWhiteList.Count() == 0)
                        {
                            throw new AuthenticationException("Connection denied.");
                        }
                    }

                    //Check number of open tokens limit
                    int openTokensLimit = clientUser.Client.OpenTokensLimit;
                    if (openTokensLimit == 0 && !Int32.TryParse(ConfigurationManager.AppSettings["opentokenslimit"], out openTokensLimit))
                    {
                        openTokensLimit = 0;
                    }

                    if (openTokensLimit > 0)
                    {
                        List <ClientConnections> openConnections = unitOfWork.AuditRepository.GetConnectionsByClient(x => x, clientUser.Client.id)
                                                                   .Where(x => nowDateTime >= x.TokenStartDateTimeUTC && nowDateTime <= x.TokenEndDateTimeUTC).ToList();
                        if (openConnections != null && openConnections.Count() > openTokensLimit)
                        {
                            throw new AuthenticationException("Total number of open connection per client exceeds the limit.");
                        }
                    }

                    //Set timeouts
                    int tokenTimespanSec = clientUser.Client.TokenTimeOut;
                    if (tokenTimespanSec == 0 && !Int32.TryParse(ConfigurationManager.AppSettings["timeoutseconds"], out tokenTimespanSec))
                    {
                        tokenTimespanSec = 900;
                    }

                    DateTime tokenExpiration = nowDateTime.AddSeconds(tokenTimespanSec);

                    auditLog.TokenStartDateTimeUTC = nowDateTime;
                    auditLog.TokenEndDateTimeUTC   = tokenExpiration;
                    unitOfWork.Commit();

                    //record new connection
                    var newConnection = new ClientConnections()
                    {
                        LoginUser = clientUser,
                        ConnectionClientAccount = clientUser.Client,
                        ConnectionAuditLog      = auditLog,
                        TokenStartDateTimeUTC   = nowDateTime,
                        TokenEndDateTimeUTC     = tokenExpiration
                    };
                    unitOfWork.AuditRepository.CreateClientConnectionLog(newConnection);

                    //Generate claims for the token
                    var identity = new ClaimsIdentity("JWT");
                    identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
                    identity.AddClaim(new Claim(ClaimTypes.Email, clientUser.Email));
                    identity.AddClaim(new Claim(ClaimTypes.Expiration, tokenExpiration.ToString()));
                    identity.AddClaim(new Claim("LogId", auditId.ToString()));
                    var tokenEnd = DateTime.UtcNow.AddSeconds(tokenTimespanSec);

                    var ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
                    context.Validated(ticket);
                }
                catch (Exception ex)
                {
                    if (ex is AuthenticationException)
                    {
                        context.SetError("invalid_grant", ex.Message);
                    }
                    else
                    {
                        context.SetError("invalid_grant", String.Format("Internal Error (Please contact Exiger support with reference ID: {0})", auditLog.Id));
                    }
                    auditLog.ErrorMessage = ex.Message;
                }
                finally
                {
                    unitOfWork.Commit();
                }
            }
            return;
        }
コード例 #3
0
        public string Protect(AuthenticationTicket data)
        {
            if (data == null)
            {
                throw new ArgumentNullException(nameof(data));
            }

            AuditActivityLog auditLog = null;
            var signedAndEncodedToken = "";

            using (var unitOfWork = new UnitOfWorkFactory().Create())
            {
                var logIdClaim = data.Identity.FindFirst("LogId");
                if (logIdClaim != null)
                {
                    int logId = Int32.Parse(logIdClaim.Value);
                    data.Identity.RemoveClaim(logIdClaim);
                    auditLog = unitOfWork.AuditRepository.GetAuditActivityLogById(x => x, logId);
                }
                //The following case should never happen, but just in case, to ensure theer is always a log object
                if (auditLog == null)
                {
                    auditLog = new AuditActivityLog()
                    {
                        SenderUserID     = data.Identity.FindFirst(ClaimTypes.Name).Value,
                        SenderRequestURL = "unknown",
                        SenderIP         = "unkbnown",
                        AuditDateTime    = DateTime.Now
                    };
                    unitOfWork.AuditRepository.CreateAuditActivityLog(auditLog);
                }

                var expClaim         = data.Identity.FindFirst(ClaimTypes.Expiration);
                var tikenExpDateTime = expClaim == null?DateTime.SpecifyKind(DateTime.UtcNow.AddSeconds(900), DateTimeKind.Utc) : DateTime.SpecifyKind(DateTime.Parse(expClaim.Value), DateTimeKind.Utc);

                data.Identity.RemoveClaim(expClaim);

                //Get identity's claims passed from CustomOAuthProvider
                var claimsIdentity = new ClaimsIdentity(data.Identity.Claims);

                //Currently using a symetrical key algorithm for signing
                var signingKey         = new InMemorySymmetricSecurityKey(Encoding.UTF8.GetBytes(_secret));
                var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256Signature, SecurityAlgorithms.Sha256Digest);

                //AppliesToAddress and TokenIssuerName must be valid URI’s. Not in the sense that they should be resolvable, but they must be in a valid URI format
                //The AppliesToAddress should contain the token’s audience, i.e. the website or application that will receive te token.
                //The TokenIssuerName is the application issuing the token
                var securityTokenDescriptor = new SecurityTokenDescriptor()
                {
                    AppliesToAddress   = _tokenTarget,
                    TokenIssuerName    = _tokenIssuer,
                    Subject            = claimsIdentity,
                    SigningCredentials = signingCredentials,
                };

                securityTokenDescriptor.Lifetime = new System.IdentityModel.Protocols.WSTrust.Lifetime(DateTime.UtcNow, tikenExpDateTime);
                var tokenHandler = new JwtSecurityTokenHandler();
                var plainToken   = tokenHandler.CreateToken(securityTokenDescriptor);
                signedAndEncodedToken = tokenHandler.WriteToken(plainToken);

                auditLog.AuthenticationToken = signedAndEncodedToken.ToString();

                unitOfWork.Commit();
            }
            return(signedAndEncodedToken);
        }