public static async Task <HttpResponseMessage> SendMessage( [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestMessage req, [SecurityTokenValidation] SecurityTokenResult tokenResult, [SignalR(HubName = Constants.HubName)] IAsyncCollector <SignalRMessage> signalRMessages) { if (!PassTokenValidation(req, tokenResult, out var unauthorizedActionResult, out var isAdmin)) { return(unauthorizedActionResult); } var message = new JsonSerializer().Deserialize <ChatMessage>(new JsonTextReader(new StreamReader(await req.Content.ReadAsStreamAsync()))); // prevent broadcast on non-administrator caller if (!isAdmin && message.Recipient == null && message.GroupName == null) { return(req.CreateErrorResponse(HttpStatusCode.Forbidden, "Non administrator cannot broadcast messages")); } return(await BuildResponseAsync(req, signalRMessages.AddAsync( new SignalRMessage { UserId = message.Recipient, GroupName = message.GroupName, Target = "newMessage", Arguments = new[] { message } }))); }
public static Task <HttpResponseMessage> GetSignalRInfo( [HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequestMessage req, [SecurityTokenValidation] SecurityTokenResult tokenResult, [SignalRConnectionInfo(HubName = Constants.HubName)] SignalRConnectionInfo connectionInfo) { return(tokenResult.Status == SecurityTokenStatus.Valid ? Task.FromResult(req.CreateResponse(HttpStatusCode.OK, connectionInfo)) : Task.FromResult(req.CreateErrorResponse(HttpStatusCode.Unauthorized, $"Validation result: {tokenResult.Status.ToString()}; Message: {tokenResult.Exception?.Message}"))); }
public static async Task <HttpResponseMessage> RemoveFromGroup( [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestMessage req, [SecurityTokenValidation] SecurityTokenResult tokenResult, [SignalR(HubName = Constants.HubName)] IAsyncCollector <SignalRGroupAction> signalRGroupActions) { if (!PassTokenValidation(req, tokenResult, out var unauthorizedActionResult, out _)) { return(unauthorizedActionResult); } var message = new JsonSerializer().Deserialize <ChatMessage>(new JsonTextReader(new StreamReader(await req.Content.ReadAsStreamAsync()))); return(await BuildResponseAsync(req, signalRGroupActions.AddAsync( new SignalRGroupAction { ConnectionId = message.ConnectionId, UserId = message.Recipient, GroupName = message.GroupName, Action = GroupAction.Remove }))); }
private static bool PassTokenValidation(HttpRequestMessage req, SecurityTokenResult securityTokenResult, out HttpResponseMessage unauthorizedActionResult, out bool isAdmin) { isAdmin = false; if (securityTokenResult.Status != SecurityTokenStatus.Valid) { // failed to pass auth check unauthorizedActionResult = req.CreateErrorResponse(HttpStatusCode.Unauthorized, securityTokenResult.Exception.Message); return(false); } unauthorizedActionResult = null; foreach (var claim in securityTokenResult.Principal.Claims) { if (claim.Type == "admin") { isAdmin = Boolean.Parse(claim.Value); } } return(true); }