web-dev-qa-db-fra.com

J'obtiens "L'autorisation a été refusée pour cette demande." message d'erreur lors de l'utilisation de OWIN oAuth middleware (avec serveur d'authentification et de ressources séparé)

J'essaie de découpler mon serveur d'authentification et de ressources. Je suis l'exemple fourni dans ce tutoriel:

http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/

C'est le code dans mon Startup.cs dans mon serveur d'authentification:

using Microsoft.Owin;
using Microsoft.Owin.Security.OAuth;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AuthServer.Web
{
   public class Startup
   {
      public void Configuration(IAppBuilder app) {
         ConfigureOAuth(app);
      }

      public void ConfigureOAuth(IAppBuilder app)
      {
         OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
         {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
            Provider = new SimpleAuthorizationServerProvider()
         };

         // Token Generation
         app.UseOAuthAuthorizationServer(OAuthServerOptions);
         app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

      }
   }
}

Il s'agit du startup.cs de mon serveur de ressources (c'est-à-dire mon exemple d'application d'API Web):

using Microsoft.Owin.Security.OAuth;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AuthTestApi.Web
{
   public class Startup
   {
      public void Configuration(IAppBuilder app)
      {
         app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
         app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
      }      
   }
}

Lorsque je poste la demande suivante au point de terminaison "\ token" de mon serveur d'authentification, je reçois avec succès un jeton:

{
access_token: "PszrzJUtQUhX42GMryWjZiVHuKiJ9yCVH_1tZURumtC5mTj2tpuRDF3tXcN_VNIYuXY40IG0K7W3KASfJ9DlNIU2jMOkL2U5oEAXLNRRQuNYdEJ7dMPb14nW19JIaM4BMk00xfQ8MFRw0p6-uoh0-e-Q6iAiTwDNN3F7bYMF9qm874qhLWEcOt6dWQgwpdDUVPDi7F07-Ck0zAs48Dg5w4q93vDpFaQMrziJg9aaxN8",
token_type: "bearer",
expires_in: 86399
}

Lorsque je poste la demande suivante à mon contrôleur, je reçois le message d'erreur "L'autorisation a été refusée pour cette demande"?

GET /api/Test HTTP/1.1
Host: localhost:63305
Accept: application/json
Content-Type: application/json
Authorization: Bearer PszrzJUtQUhX42GMryWjZiVHuKiJ9yCVH_1tZURumtC5mTj2tpuRDF3tXcN_VNIYuXY40IG0K7W3KASfJ9DlNIU2jMOkL2U5oEAXLNRRQuNYdEJ7dMPb14nW19JIaM4BMk00xfQ8MFRw0p6-uoh0-e-Q6iAiTwDNN3F7bYMF9qm874qhLWEcOt6dWQgwpdDUVPDi7F07-Ck0zAs48Dg5w4q93vDpFaQMrziJg9aaxN8
Cache-Control: no-cache
Postman-Token: aeca8515-70b1-ef2c-f317-bf66136dccab

Mes projets de serveur d'authentification et de ressources/API Web sont dans des solutions différentes et fonctionnent sur des ports différents (... je ne sais pas si cela importe, mais j'ai pensé le mentionner).

À ce stade, ces 2 projets utilisent oAuth middleware OWIN (et a très peu de code personnalisé). Le middleware est un peu blackbox et a juste besoin d'aide pour comprendre pourquoi je reçois cette erreur message.

Notez également que j'exécute les deux serveurs dans deux projets d'application Web Visual Studio 2013 qui se trouvent dans différentes solutions VS 2013 qui s'exécutent sur des ports différents. Je ne sais pas si cela importe, mais j'ai pensé que je le mentionnerais.

Merci d'avance.

23
user1870738

J'étais confronté exactement au même problème au cours des deux derniers jours, bien que j'héberge les deux applications sur la même machine (ports différents), mais cela n'a pas fonctionné sans ajout de la clé machine aux deux fichiers web.config et assurez-vous que le même numéro de version des packages est installé dans les deux applications

3
Islam El-Khayat

Je viens de rencontrer le même problème et j'ai trouvé la solution:

Vous devez enregistrer le OAuth Token Generator et OAuth Token Consumer Things before WebAPI est enregistré).

Cela a du sens si vous considérez cela comme un pipeline, où l'authentification/autorisation devrait précéder toute demande de traitement par les contrôleurs.

TL; DR: Modifier

appBuilder.UseWebApi(config);

this.ConfigureOAuthTokenGenerator(appBuilder);
this.ConfigureOAuthConsumer(appBuilder);

À

this.ConfigureOAuthTokenGenerator(appBuilder);
this.ConfigureOAuthConsumer(appBuilder);

appBuilder.UseWebApi(config);
25
cguedel

Je recevais également le message d'erreur "L'autorisation a été refusée pour cette demande", même si je n'ai pas de serveurs d'authentification et de ressources séparés.

J'utilise OwinHost de Ninject et je l'ai configuré dans le démarrage avant de configurer OAuth, comme suit:

public void Configuration(IAppBuilder app)
{
    var config = new HttpConfiguration();

    app.UseNinjectMiddleware(() =>
    {
        var kernel = new StandardKernel();
        kernel.Load(Assembly.GetExecutingAssembly());
        return kernel;
    }).UseNinjectWebApi(config);

    ConfigureOAuth(app);

    WebApiConfig.Register(config);
    app.UseCors(CorsOptions.AllowAll);
    app.UseWebApi(config);
}

J'ai trouvé que déplacer la configuration Ninject à la fin a résolu le problème, comme suit:

public void Configuration(IAppBuilder app)
{
    var config = new HttpConfiguration();

    ConfigureOAuth(app);

    WebApiConfig.Register(config);
    app.UseCors(CorsOptions.AllowAll);
    app.UseWebApi(config);

    app.UseNinjectMiddleware(() =>
    {
        var kernel = new StandardKernel();
        kernel.Load(Assembly.GetExecutingAssembly());
        return kernel;
    }).UseNinjectWebApi(config);
}

Votre problème est peut-être lié à l'ordre de démarrage de votre middleware.

14
gwhn

Dans mon article, j'étais clair que vous devez remplacer le nœud machineKey pour les deux API (serveur d'autorisation et serveur de ressources) et partager la même machineKey entre les deux fichiers web.config. Comment hébergez-vous ces 2 projets différents? ils sont sur la même machine ou sur des machines différentes? Veuillez revenir à l'étape 5 de la publication et vérifier comment vous pouvez y parvenir.

4
Taiseer Joudeh

Pour moi, le problème était un numéro de version incompatible dans les packs Owin:

 <dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>

Après avoir mis à jour les anciens packages requis, tout fonctionnait comme un charme. :)

3
Kádi

Mise à jour du 6 juin 2018 - en utilisant les derniers packages WebAPI et OWIN. Je me suis cogné la tête contre ce problème pendant plus que je ne voudrais l'admettre. Aucune des suggestions ci-dessus n'a fonctionné pour moi, les choses ont soudainement commencé à fonctionner une fois que j'ai ajouté une certaine dépendance au projet que je n'utilisais même pas dans mon code: le Microsoft.Owin.Host.SystemWeb Package NuGet . Cette configuration est beaucoup trop capricieuse et en boîte noire à mon goût, je ne sais pas pourquoi cela fonctionne comme ça, mais voici ce que j'ai fait.

La configuration minimale dont j'avais besoin pour le service de ressources (le service d'authentification/jeton était déjà configuré):

  • ajouter des références à Microsoft.Owin.Security.Oauth et Microsoft.Owin.Host.SystemWeb
  • créez un fichier startup.cs avec le contenu suivant:

    using Microsoft.Owin;
    using Owin;
    using Microsoft.Owin.Security.OAuth;
    
    [Assembly: OwinStartup(typeof(MyProject.Startup))]
    
    namespace MyProject
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions{ });
            }
        }
    }
    
  • Ajoutez ce qui suit à votre Web.config fichier dans le <appSettings> section

<add key="owin:appStartup" value="MyProject.Startup" />
2
Mihai Coman

Dans votre classe OwinStartup, IAppBuilder.UseOAuthBearerTokens () doit être appelé AVANT IAppBuilder.UseWebApi ()

public void Configuration(IAppBuilder app)
{
    app.UseOAuthBearerTokens(...);
    app.UseWebApi(...);
}
1
Derek Comartin