How can I avoid boilerplate code to validate JWT Token in ASP.NET Web API 2? [closed] - c#

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 5 years ago.
Improve this question
All my REST API methods start with that code as follows:
[HttpPost]
[Route("Login")]
public async Task<IHttpActionResult> Login(QueryModel q)
{
// get JWT Token string form HTTP Header
string token = Request.Headers.GetValues("Authorization").FirstOrDefault();
// decode token
string json = Jose.JWT.Decode(token, JWTModel.secretForAccessToken);
JWTModel jwt = JsonConvert.DeserializeObject<JWTModel>(json);
// check if issued from my homepage.
if (!jwt.iss.Equals("my-home-page.com"))
{
return Content(
HttpStatusCode.Unauthorized,
"access token is not from here"
);
}
// check if it has valid about time
long now = (long)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
if (jwt.iat > now || jwt.exp < now)
{
// request refresh token
return Content(
HttpStatusCode.Unauthorized,
"outdated access token"
);
}
/* ... */
}
How ridiculous and redundant are they!
Can I simplify and modulize them? And How?
(In Node.js, I can solve it by using so called middleware.)

I would suggest you look at DelegatingHandler or if you are running an OWIN based application then you can create Middleware
DelegatingHandler MSDN Link
OWIN Middleware MSDN

Related

How to prevent users to add entries for a given time using ASP NET MVC? [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 1 year ago.
Improve this question
I have this scenario:
Add a product but block adding for 1 minute for other users. After 1 min they can normally add one.
Adding a product it is not blocked for the user itself who added it
but for others.
I have this and it is working like a charm:
public async Task<JsonResult> AddProducts(string citaId, string paciente, string medico, string modalidad)
{
var usuario = System.Web.HttpContext.Current.User.Identity.GetUserName();
if (Session["User"] != null)
{
if(Session["User"].ToString() != usuario)
{
var med = await _context.MEDICOS.FindAsync(medico);
var objetoerrr1 = new
{
type = "error",
message = $"you cannot add a product, WAIT 1 MIN."
};
return Json(objetoerrr1, JsonRequestBehavior.AllowGet);
}
}
... the rest of the code for adding a product
// create a session
Session["User"] = usuario;
Session.Timeout = 1;
But my problem is that it is not working when using different browsers or PCs and It is like session is empty in different devices.
Well I have never worked with sessions in ASP NET MVC5 before so when I heard this requeriment, sessions came to my mind so I used them.
How can I achieve such thing? Should I use database to store the session or something? Or should not I be using sessions for this approach?
You should save the sessions into database, not only for this, also for security reasons. And give that session an unique identifier (and save it inside the cookie and retrieve and check it everytime) in order to know login timestamp, logout timestamp, prevent cookie-copy between browsers, prevent cookie-copy after log out, prevent browser-copy, duplicated sessions, if roles changes meanwhile the user is logged in, etc.
Of course there are a lot of ways to do this without database, but this is my answer. I use only database for this because I save user logins into database, as their roles.

Calculate lines of code change for a commit? [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 2 years ago.
Improve this question
Is there a way to calculate lines of code in a Pull Request API in Azure Devops for each file. I have gone through below two links and but was not of much help.
Is there a way to get the amount of lines changed in a Pull Request via the Dev Ops Service REST API?
Lines of Code modified in each Commit in TFS rest api. How do i get?
Thank you.
Steps:
a. Get the commit IDs for the specified pull request
GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullRequests/{pullRequestId}/commits?api-version=6.1-preview.1
b. Get commit path via the commit ID
GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/commits/{commitId}/changes?api-version=5.0
c. Get parents commit ID via commit ID
GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/commits/{commitId}?api-version=5.0
d. Get the result via below API and request body.
POST https://dev.azure.com/{Org name}/_apis/Contribution/HierarchyQuery/project/{Project name}?api-version=5.1-preview
Request Body:
{
"contributionIds": [
"ms.vss-code-web.file-diff-data-provider"
],
"dataProviderContext": {
"properties": {
"repositoryId": "{Repo ID}",
"diffParameters": {
"includeCharDiffs": true,
"modifiedPath": "{Commit path}",
"modifiedVersion": "GC{Commit ID}",
"originalPath": "{Commit path}",
"originalVersion": "GC{parents commit ID}",
"partialDiff": true
}
}
}
}
Result:

Service did not receive API Data through WebClient [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 3 years ago.
Improve this question
I am trying to send data from API to web service. But it is always receiving null
Code in API - WEB CLIENT:
using (var webClient = new WebClient())
{
webClient.Headers[HttpRequestHeader.ContentType] = "application/json";
var url = string.Format("End Point URL /SomeAction");
var user= new User()
{
...
};
var data = JsonConvert.SerializeObject(user);
webClient.UploadString(url, data);
}
Service:
public ActionResult SomeAction([System.Web.Http.FromBody]string data)
{
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
FOUsers dataFromXBO =
(FOUsers)json_serializer.DeserializeObject(data);
//statements
}
Please advice, How can i receive data that passed from API
To answer your question directly, to extract a string from a request body, wrap your "string" in another object as per this SO link. ie.
class UserPostRequest{
public string UserJson{get; set;}
}
And change the signature in your controller as follows:
public ActionResult SomeAction([System.Web.Http.FromBody]UserPostRequest data)
With that said, in this specific instance it's likely that you can just do:
public ActionResult SomeAction([System.Web.Http.FromBody]FOUsers data)
and let the API take care of deserialization for you.
EDIT:
After further research, to add completeness to the first half of my answer let me acknowledge that there are many ways to skin that particular cat. The answer provided is just the one I've historically used. Here's another SO post that enumerates other solutions, including accepting a dynamic or HttpRequestMessage in your API method signature. These would be particularly helpful if for some reason you didn't want to change your client code. That said, again, I don't see a particular reason to do manual serialization if you're just going to end up consuming the out-of-the-box functionality.

Why dont .NET return null when requesting cookies that don't exist? [closed]

Closed. This question is opinion-based. It is not currently accepting answers.
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 8 years ago.
Improve this question
If i would use the following code to retrieve a cookie:
Request.Cookies.Get("LoremIpsum")
and this cookie didn't exist I would then get an empty cookie back instead of null. Why is this?
It caused some problems when i wanted to look into the Response cookie collection aswell as the request cookie collection. If the cookie i wanted didn't exist in the response it would add an empty cookie into the response cookie collection and then return it to me. So the cookie which existed in the request would be replaced by the empty response cookie after the page load.
Really annoying and I'm guessing there must be a reason why .NET don't just return null instead?
It caused some problems
It shouldn't, because it is documented:
If the named cookie does not exist, this method creates a new cookie with that name.
So don't assign it without checking:
var cookie = Request.Cookies.Get("LoremIpsum");
if (!string.IsNullOrEmpty(cookie.Value))
{
Response.Cookies["LoremIpsum"] = cookie;
}
Alternatively, don't use Get(), but use the indexer, which does return null if the given cookie doesn't exist:
var cookie = Request.Cookies["LoremIpsum"];
if (cookie != null)
{
Response.Cookies["LoremIpsum"] = cookie;
}

Connect to Stack Overflow API [closed]

Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 8 years ago.
Improve this question
I am trying to connect to the Stack Overflow API as one of my first api calls, but I am struggling.
Can someone tell me why this code does not return a success code?
using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("https://api.stackexchange.com/");
var response = await client.GetAsync("questions");
if (response.IsSuccessStatusCode)
{
}
else
{
Console.WriteLine(response.ToString());
}
}
The response tells you site is required. Hit https://api.stackexchange.com/questions?site=stackoverflow instead.
You're getting back
{"error_id":400,"error_message":"site is required","error_name":"bad_parameter"}
If you read the error and documentation, it needs to know which StackExchange site you want. Try:
https://api.stackexchange.com/questions?site=stackoverflow

Categories

Resources