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) { }
/// <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"); }