How to implement authentication in WebAPI in an existing application - asp.net

I am working on an existing project which is on dotnet framework 3.5 . I want to implement Web API and want to call this webAPI from javascript by using jquery.
I want to apply basic authentication and also want to use authorize the HTTP methods of WebAPI.
Before using webAPI we are using simple authentication process by using Session variables in our application and checking the authentication and authorization process in page load method it self in the page.
Please suggest some better idea to implement the web API authentication in my application.

A quick google brings up lots of results.
Http Authentication using filters
Http Authentication using message handlers
Or you can checkout the webapicontrib which has examples of Http Basic Auth and more. You will possibly run into cors issues calling the api with javascript, webapicontrib has an example of a cors handler too if you need it.

Take a look at the Thinktecture identity library. It's so far the most complete one for ASP.NET projects, http://thinktecture.github.com/Thinktecture.IdentityModel.45/

Related

ASP.NET Core receive SignalR updates

I know SignalR is not available for ASP.NET Core 1.1 and in preview for 2.0. Meantime I need to work around this limitation.
The application I'm building is an ASP.NET Core 1.1 MVC application. One small but important feature in this application is case management. The view needs to be updated with new incoming cases for that specific user.
My SignalR 2 hub runs in a separate ASP.NET 4.* application.
I was hoping as this is all 1-way that I could easily use the SignalR JavaScript client instead of the .NET client and Bob is your uncle.
The problem however is AuthN/AuthZ for which I'm using Azure AD B2C (oauth2)
Within the MVC app I use standard cookie authorization, but the pattern I'm using for the backend API's is that I use my MVC code to wrap the access token in a bearer tokens and sent that to the backend API where I use jwt bearer authorization. Therefore my clientside JavaScript never sees the access token, just the cookies that the MVC app uses between View and Controller.
The problem now is that if I want to connect to the Hub using JavaScript I have nothing to sent to the Hub to prove my identity as the jwt token only exists in the MVC host, and the cookies are HTTP Only so inaccessible.
Any ideas or alternatives?
Thanks!
Ok I found it! I can use the following method to pass along the cookie from my MVC app:
Follow instructions in https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/compatibility/cookie-sharing to setup cookie sharing
Use the withCredentials=true on XMLHttpRequest.withCredentials through the start method on the hubConnection in SignalR
conn.start({ withCredentials: true }).done(function () {
hub.invoke('recordHit');
});
Setup CORS in the Hub project.
easy! Works like a charm

Challenge while setting up seamless authentication across MVC and Web API Layer

I work on an application where I have a separate MVC layer and Web API Layer, both have the same authentication mechanism, I have chosen the individual accounts authentication option while adding the projects. The web api service layer will be directly accessed by some other mobile clients also.
But when the user logs in through MVC he should be able to access Web Api seamlessly, but I don’t want to really pass the username and password from MVC to the Web Api layer, I am told it is a bad practice. but i need to authenticate and authorize my user, so the only option i have thought of is to have a default account at Web API level to issue tokens, and this will be called from MVC post the authentication and a token will be returned which is written to a cookie in the client. Now the Ajax calls from the UI can use this bearer token and get the job done.
The only glitch I have here is that, because I am using a default account I need user details again for authorization at service level, though I am doing authorization at my UI level, the user can spoof the system. I was lost here and came up with a solution like, when the user logs in to MVC will send across user details also along with the call to get the WebAPI token and issue another token to the user so that the user uses both of the tokens to make a call to web api from MVC.
I am not sure if this works or if it is even the best way. I just wanted to check, how I should go from here. Any help on this will be really great.
This is a really good example of integration - I know they use Angular as the client but you can learn from this:
http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/
Check this section to see how they decouple the API from the front end (Part of the same article).
http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/

OWIN AuthorizeEndpoint with redirect_uri different than uri of web api

I am successfully using bearer token authentication for asp.net web API as is demonstrated in the default single page application template. But now I want to use the same web API from a different site (a different url).
When I make a request to web API AuthorizeEndpoint(by default /api/Account/ExternalLogin) from different site, I get error: invalid_request. I guess the problem is in the redirect_uri value, since changing that to value of site running on same domain as web api resolves the problem.
ValidateClientRedirectUri method in application OAuthAuthorizationServerProvider doesn't get fired. So based on my search in Katana source the error origin is in OAuthAuthorizationServerHandler.InvokeAuthorizeEndpointAsync.
Does anyone else have the same problems or am I doing something wrong?
The Katana OAuth middleware is not designed to be cross application - it is mainly for "embedding" an OAuth authorization server into the business resource.
If you want a proper (free) authorization server - have a look here:
https://github.com/thinktecture/Thinktecture.AuthorizationServer/wiki
The bearer token appears to be a hash into an claims hash, which is local to your application.
We are using a jwt token with a separate validate handler. Works cross application.
Still looking for a better way but for now it works.

using WIF in ASP.NET Web API Service

I am trying to do something like this:
I have a MVC4 Web App and a Web-API service (hosted on two separate roles in azure)
Another role runs CustomSTS1.
The MVC Web App trusts the CustomSTS1
Now the customer logs into the site he is redirected to the STS login page.
Once logged in, he is redirected back to the MVC Web Site.
From this web site, the customer performs actions, which in turn invoke the web-API Service.
I have the SAML token in the web app, which I pass to the WebAPI service.
Now when I try to validate the SAML token at the Web API side, I get a
Message=ID1032: At least one 'audienceUri' must be specified in the SamlSecurityTokenRequirement when the AudienceUriMode is set to 'Always' or 'BearerKeyOnly'. Either add the valid URI values to the AudienceUris property of SamlSecurityTokenRequirement, or turn off checking by specifying an AudienceUriMode of 'Never' on the SamlSecurityTokenRequirement.
This is without the Web API service trusting the CustomSTS1
Once I setup the trust,
I am always given a HTTP 401: UNAUTHORIZED, whenever I try to make a HTTP Get request to the WEB API Service.
Now, My Question is, (I know that my current approach is definitely wrong)
How do I setup the Trust relationship with the CustomSTS1, such that the WebAPI service is able to do an ActAS on behalf of the user logged into the MVC site?
OR
Is this architecture wrong?
And is there another way to achieve this?
That approach is wrong conceptually. The MVC application should negotiate a new token for the Web API in the STS using ActAs. That's how it traditionally works for SOAP Services. However, Web APIs are moving away from SAML as it is a complex format that relies on different WS-* specs. OAuth 2.0 is becoming the standard in that area if you want to support SSO at that level.
Another approach is to establish an implicit trust between the MVC app and the Web API, so all the calls to the Web API from the MVC app are done through a more standard Http auth mechanism like Basic Auth using an specific set of credentials that only the MVC app knows. The info about the logged user in the MVC app is passed as additional information.
Regards,
Pablo.

Silverlight and ASP.NET authorization

My website uses Forms authentication. I did silverlight 3 module which is designed to work in context of asp - authenticated user. Silverlight module talks with WCF hosted by the same asp.net website, but the issue is that it cannot authenticate to WCF service.
I run Fiddler and I see that .ASPXAUTH cookie is not sent to WCF service.
How to force Silverlight to get this cookie from browser and send it to service?
Finally I solved it.
The problem of missing cookie was made by inproper host name.
I was sending asp.net requests to myhostname, but SL was calling WCF using myhostname.mylocaldomainnam.local. This is why there was no .aspauth cookie during WCF calls.
I've used it successfully. First, I make sure that there are is a service endpoint for the WCF AuthorizationService used by ASP.NET. Then use the Silverlight project to generate a "Service Reference" to the AuthorizationService. Finally, in your module, you will use that service reference to login your visitor using their credentials stored within your provider. If you have some more information on how you've built your site, I might be able to offer a more concise answer to your problem.

Resources