We have an ASP.NET MVC 5
app and need to authenticate users via an organization by using the following info:
Redirect Uri, Client Id, Secret Key, token_uri, resource_uri.
There are several tutorials explaining this e.g. How to implement oauth2 server in ASP.NET MVC 5 and WEB API 2 and Create an ASP.NET MVC 5 App with Facebook, Twitter, LinkedIn and Google OAuth2 Sign-on (C#) but most of them use Azure
or Web API
, but I do not want to use API
or Azure
. So, how can I implement this OAuth2 Authentication
?
Update:
Here is my code using @WiktorZychla's tutorial. But id does not seem to work :(
web.config:
<system.web>
<authentication mode="Forms">
<forms name=".DemoAuthCookie" loginUrl="~/Account/Login" timeout="30"
slidingExpiration="true" protection="All" />
</authentication>
</system.web>
View:
<button type="button" onclick="location.href='@Url.Action("Authorize", "Account")';
return false;" />Login</button>
Controller:
public readonly GoogleClient gClient = new GoogleClient
{
AuthorizationTracker = new MyAuthorizationTracker(),
ClientIdentifier = "x...", //client id
ClientCredentialApplicator = ClientCredentialApplicator.PostParameter("x...") //secret
};
[AllowAnonymous]
public ActionResult Authorize()
{
IAuthorizationState authorization = gClient.ProcessUserAuthorization();
// Is this a response from the Identity Provider
if (authorization == null)
{
// no
// Google will redirect back here
Uri uri = new Uri("http://localhost:53105/Account/Login");
// Kick off authorization request with OAuth2 scopes
gClient.RequestUserAuthorization(returnTo: uri,
scope: new[] { GoogleClient.OpenId,
GoogleClient.ProfileScope, GoogleClient.EmailScope });
}
else
{
// yes
var request = WebRequest.Create(GoogleClient.ProfileEndpoint);
// add an OAuth2 authorization header
// if you get 403 here, turn ON Google+ API on your app settings page
request.Headers.Add(
HttpRequestHeader.Authorization,
string.Format("Bearer {0}", Uri.EscapeDataString(authorization.AccessToken)));
// Go to the profile API
using (var response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
var profile = GoogleProfileAPI.Deserialize(responseStream);
if (profile != null &&
!string.IsNullOrEmpty(profile.email))
FormsAuthentication.RedirectFromLoginPage(profile.email, false);
}
}
}
return RedirectToAction("Index", "Home");
}