Exemple #1
0
        protected override async Task <AuthenticateResult> HandleAuthenticateAsync()
        {
            Logger.LogInformation(Request.Path);

            var endpoint = Context.GetEndpoint();

            if (endpoint?.Metadata?.GetMetadata <IAllowAnonymous>() != null)
            {
                return(AuthenticateResult.NoResult());
            }

            try
            {
                if (!TryGetToken(out var token))
                {
                    return(AuthenticateResult.NoResult());
                }

                using var db = new TwitchBotContext();

                var eventToken = await db.EventTokens.AsNoTracking().FirstOrDefaultAsync(x => x.Token == token);

                if (eventToken == null)
                {
                    throw new Exception("Invalid access token");
                }

                var claims = new[]
                {
                    new Claim(ClaimTypes.NameIdentifier, eventToken.UserId),
                    new Claim(ClaimTypes.Name, eventToken.Username),
                    new Claim(ClaimTypes.Sid, eventToken.Token)
                };
                var identity  = new ClaimsIdentity(claims, Scheme.Name);
                var principal = new ClaimsPrincipal(identity);
                var ticket    = new AuthenticationTicket(principal, Scheme.Name);

                return(AuthenticateResult.Success(ticket));
            }
            catch (Exception ex)
            {
                return(AuthenticateResult.Fail(ex.Message));
            }
        }
        public async Task <ActionResult> Logout()
        {
            var username = User.GetClaim(ClaimTypes.Name);
            await _service.Unsubscribe(User.GetClaim(ClaimTypes.NameIdentifier));

            TwitchChatTask.DisconnectUser(username);

            // Create event token for this user
            using var db = new TwitchBotContext();

            var eventToken = await db.EventTokens.FirstOrDefaultAsync(x => x.Username == username);

            if (eventToken != null)
            {
                db.Remove(eventToken);
                await db.SaveChangesAsync();
            }

            return(Ok());
        }
        public async Task <ActionResult <LoginResponse> > Login([FromBody] LoginRequest request)
        {
            if (string.IsNullOrEmpty(request?.Username))
            {
                return(Unauthorized());
            }

            if (!_settings.Logins.TryGetValue(request.Username, out var password) || request.Password != password)
            {
                _logger.LogWarning("Failed login for " + request.Username);
                return(Unauthorized());
            }

            // Create subscription for user
            var(user, subscriptions) = await _service.Subscribe(request.Username);

            if (user == null)
            {
                return(NotFound());
            }

            // Connect to twitch chat
            TwitchChatTask.WatchUser(user);

            // Create event token for this user
            using var db = new TwitchBotContext();

            var eventToken = await db.EventTokens.FirstOrDefaultAsync(x => x.Username == request.Username.ToLower());

            if (eventToken == null)
            {
                eventToken = new(request.Username.ToLower(), user.UserId);
                await db.AddAsync(eventToken);

                await db.SaveChangesAsync();
            }

            var response = new LoginResponse(eventToken.Token, subscriptions, new(user.DisplayName, user.UserId, user.ImageUrl));

            return(Ok(response));
        }
 /// <summary>
 /// Initiate a new instance of <see cref="RepositoryCommand"/> repository.
 /// </summary>
 /// <param name="context">A valid <see cref="TwitchBotContext"/> context.</param>
 public RepositoryChannel(TwitchBotContext context) : base(context)
 {
 }
 /// <summary>
 /// Initiate a new instance of <see cref="RepositoryTwitchBadge"/> repository.
 /// </summary>
 /// <param name="context">A valid <see cref="TwitchBotContext"/> context.</param>
 public RepositoryTwitchBadge(TwitchBotContext context) : base(context)
 {
 }
 /// <summary>
 /// Initiate a new instance of <see cref="RepositoryCommand"/> repository.
 /// </summary>
 /// <param name="context">A valid <see cref="TwitchBotContext"/> context.</param>
 public RepositoryCommand(TwitchBotContext context) : base(context)
 {
 }
Exemple #7
0
 /// <summary>
 /// Protected constructor for the base repository using a valid context
 /// </summary>
 /// <param name="context"></param>
 /// <exception cref="ArgumentNullException"></exception>
 protected RepositoryBase(TwitchBotContext context)
 {
     _context = context ?? throw new ArgumentNullException(nameof(context), "Cannot initialiaze a repository with a null context");
 }