Ejemplo n.º 1
0
        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 }
            })));
        }
Ejemplo n.º 2
0
 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}")));
 }
Ejemplo n.º 3
0
        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
            })));
        }
Ejemplo n.º 4
0
        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);
        }