J'ai implémenté le flux OAuth2 client_credentials dans notre application MVC. Notre application MVC est en fait la ressource dans ce scénario. J'ai eu beaucoup de mal à sécuriser un échantillon pour ce cas d'utilisation spécifique, puisque ce flux est principalement utilisé pour l'accès à l'API, mais je l'ai quand même fait.
Je voudrais partager avec vous certains des détails d'implémentation pour vous demander des informations sur les vulnérabilités que je ne connais peut-être pas. Je ne suis en aucun cas un expert en sécurité, ce qui m'a amené ici.
Dans .NET Framework 4.5.2 J'ai utilisé les bibliothèques Microsoft.Owin v3.0.1. Je sais qu'il existe de nouvelles façons de configurer ce genre de choses (.NET Core et IdentityServer4 par exemple), mais comme je l'ai dit, j'avais de la difficulté à trouver un échantillon viable pour ce cas spécifique, alors j'ai fait de mon mieux.
I mis en œuvre un fournisseur:Vulnérabilités lors de l'utilisation des informations d'identification du client et du middleware OWIN OAuth
public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
{
private ClientService clientService;
public ApplicationOAuthProvider()
{
this.clientService = new ClientService();
}
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
string clientId;
string clientSecret;
context.TryGetFormCredentials(out clientId, out clientSecret);
if (clientId == "XXXX" && clientSecret == "XXXXX")
{
context.Validated(clientId);
}
return base.ValidateClientAuthentication(context);
}
public override Task GrantClientCredentials(OAuthGrantClientCredentialsContext context)
{
var client = clientService.GetClient(context.ClientId);
var oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
oAuthIdentity.AddClaim(new Claim(ClaimTypes.Name, client.ClientName));
var ticket = new AuthenticationTicket(oAuthIdentity, new AuthenticationProperties());
context.Validated(ticket);
//context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
return base.GrantClientCredentials(context);
}
avec le code de démarrage suivant:
public partial class Startup
{
public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }
static Startup()
{
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(60),
//AllowInsecureHttp = true,
AuthenticationMode = AuthenticationMode.Active,
};
}
public void ConfigureAuth(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll)
.UseOAuthBearerTokens(OAuthOptions);
//app.UseOAuthBearerTokens(OAuthOptions);
}
}
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
ConfigureAuth(app);
}
}
puis créé une application client qui est aussi un site Web et finalement obtenu l'accès à la (application MVC) des ressources. La ressource n'a pas d'utilisateurs, donc pas d'écran de connexion. La ressource (maintenant) a un point de terminaison de jeton. L'application cliente envoie une demande au point de terminaison de jeton avec ses informations d'identification et, après l'authentification, utilise ce jeton dans les requêtes suivantes à la ressource.
J'ai trouvé 2 façons différentes d'utiliser ce jeton pour accéder.
- Incluez le jeton d'accès dans l'en-tête de la demande. OU
- Inclure le jeton d'accès en tant que paramètre de forme
Mes questions sont au sujet des vulnérabilités à ce scénario:
En supposant que toutes les communications entre l'application client et le serveur se passent sur des canaux sécurisés (https) et le client L'application est capable de maintenir les informations d'identification de manière sécurisée, quelles sont les chances qu'un badge d'accès puisse être obtenu ou intercepté? Ou y at-il des méthodes incluses dans ce flux (ou peut-être un autre flux OAuth) qui incluent également la vérification du client? Je me rends compte que le client est déjà authentifié via client_id/client_secret, mais quand je demande la vérification, je demande l'origine de la requête (en supposant bien sûr que la méthode de vérification n'inclut pas la vérification de quelque chose qui peut être usurpé) par un utilisateur malveillant).
Y a-t-il une étape supplémentaire de vérification que j'aurais peut-être ratée - parce qu'il y a beaucoup d'information là-bas et que j'ai fait de mon mieux, mais je ne peux pas prétendre avoir une bonne compréhension de tout J'ai lu jusqu'ici.
S'il y a une étape de vérification supplémentaire que j'ai manquée, comment cela s'intègre-t-il dans ce flux (client_credentials)?
Merci, Carrie
Merci beaucoup d'avoir pris le temps de l'écrire. Cela a vraiment aidé à attacher beaucoup de choses ensemble pour moi! – codenewbie