Nous avons développé un ensemble d'API Web (REST) qui sont protégées par un serveur d'autorisation. Le serveur d'autorisation a émis l'ID client et le secret client. Ceux-ci peuvent être utilisés pour obtenir un jeton d'accès. Un jeton valide peut être utilisé lors d'appels ultérieurs aux serveurs de ressources (API REST).
Je veux écrire un client basé sur le Web (Asp.net MVC 5) qui consommera les API. Y a-t-il un package nuget que je peux télécharger qui m'aidera à implémenter le flux client OAuth2? Quelqu'un peut-il me diriger vers un bon exemple sur l'implémentation client du flux OAuth2 (écrit en asp.net MVC)?
Mise à jour J'ai pu obtenir un jeton d'accès en utilisant le bloc de code ci-dessous, mais ce que je veux, c'est un "identifiant client" oauth 2 flux où je n'ai pas à entrez l'identifiant et les mots de passe. Le code que j'ai maintenant est:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType("ClientCookie");
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AuthenticationType = "ClientCookie",
CookieName = CookieAuthenticationDefaults.CookiePrefix + "ClientCookie",
ExpireTimeSpan = TimeSpan.FromMinutes(5)
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AuthenticationType = OpenIdConnectAuthenticationDefaults.AuthenticationType,
SignInAsAuthenticationType = app.GetDefaultSignInAsAuthenticationType(),
ClientId = ConfigurationManager.AppSettings["AuthServer:ClientId"],
ClientSecret = ConfigurationManager.AppSettings["AuthServer:ClientSecret"],
RedirectUri = ConfigurationManager.AppSettings["AuthServer:RedirectUrl"],
Configuration = new OpenIdConnectConfiguration
{
AuthorizationEndpoint = "https://identityserver.com/oauth2/authorize",
TokenEndpoint = "https://identityserver.com/oauth2/token"
},
//ResponseType = "client_credentials", // Doesn't work
ResponseType = "token",
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = notification =>
{
if (string.Equals(notification.ProtocolMessage.Error, "access_denied", StringComparison.Ordinal))
{
notification.HandleResponse();
notification.Response.Redirect("/");
}
return Task.FromResult<object>(null);
},
AuthorizationCodeReceived = async notification =>
{
using (var client = new HttpClient())
{
//var configuration = await notification.Options.ConfigurationManager.GetConfigurationAsync(notification.Request.CallCancelled);
String tokenEndPoint = "https://identityserver.com/oauth2/token";
//var request = new HttpRequestMessage(HttpMethod.Post, configuration.TokenEndpoint);
var request = new HttpRequestMessage(HttpMethod.Post, tokenEndPoint);
request.Content = new FormUrlEncodedContent(new Dictionary<string, string> {
{ OpenIdConnectParameterNames.ClientId, notification.Options.ClientId },
{ OpenIdConnectParameterNames.ClientSecret, notification.Options.ClientSecret },
{ OpenIdConnectParameterNames.Code, notification.ProtocolMessage.Code },
{ OpenIdConnectParameterNames.GrantType, "authorization_code" },
{ OpenIdConnectParameterNames.RedirectUri, notification.Options.RedirectUri }
});
var response = await client.SendAsync(request, notification.Request.CallCancelled);
response.EnsureSuccessStatusCode();
var payload = JObject.Parse(await response.Content.ReadAsStringAsync());
// Add the access token to the returned ClaimsIdentity to make it easier to retrieve.
notification.AuthenticationTicket.Identity.AddClaim(new Claim(
type: OpenIdConnectParameterNames.AccessToken,
value: payload.Value<string>(OpenIdConnectParameterNames.AccessToken)));
}
}
}
});
}
}
Pour prendre en charge le type d'octroi des informations d'identification client, votre meilleure option est probablement d'utiliser directement HttpClient
:
var request = new HttpRequestMessage(HttpMethod.Post, "http://server.com/token");
request.Content = new FormUrlEncodedContent(new Dictionary<string, string> {
{ "client_id", "your client_id" },
{ "client_secret", "your client_secret" },
{ "grant_type", "client_credentials" }
});
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var payload = JObject.Parse(await response.Content.ReadAsStringAsync());
var token = payload.Value<string>("access_token");
Pour les flux interactifs (comme le flux de code d'autorisation), il existe deux meilleures approches:
Si votre serveur d'autorisation prend en charge OpenID Connect (qui est basé sur OAuth2), vous pouvez simplement utiliser le middleware OpenID Connect pour OWIN/Katana 3 développé par Microsoft: https://www.nuget.org/packages/Microsoft. Owin.Security.OpenIdConnect /
Si OpenID Connect n'est pas pris en charge par votre serveur d'autorisation, une option consiste à créer votre propre middleware client OAuth2. Vous pouvez jeter un œil à la dernière partie de cette SO pour plus d'informations: Enregistrement de connexions externes à l'API Web 2 à partir de plusieurs clients API avec OWIN Identity