The timestamp you gave in the last response is earlier than the one you gave in the first one
Now: Tue, 23 May 2017 15:05:51 GMT
Before: Tue, 23 May 2017 15:31:10 GMT
I obviously don't know what I'm talking about with .NET, but one of the restrictions was that the time, whatever you put in, must be within 15 minutes of the server time and you said you "just" did it, so one of the times is wonky. It's probably something else, but I just wanted to throw that out there to make sure it's generating the correct time.
The other thing I would do is eliminate the query parameters and get it working with just a basic call first. I don't think that's the issue you said you were able to generate the right code with my example data and it's an unauthorized 401 error not an invalid parameter error, but you try to get the simple to work first. Still, if the query part was somehow off, it would mess up the HMAC signature and that could lead to an unauthorized error. Anyway, start with the simple to make sure to rule things out.
When I was testing this out, I went into a REST client (I use Advanced Rest Client for Chrome but a lot of people like Postman) and test it out manually. Log all of the information that you're getting and then put it in and make the call. You've got 15 minutes so it's not a big rush. If it works there, then it's something in your implementation. You didn't show the line that actually makes the call to the API, so I'm not sure what happens there (I probably wouldn't understand it anyway).
You can double check your API secret and key and make sure that you got them transferred correctly.
You might give the Canvas Data command line tool a try and see if you can get it to work. After all the work I did figuring out how to make the HMAC signature and do the calls, I ended up just using it.
If none of that helps, then I hope someone else steps as I'm running out of ideas.