Je reçois "autorisation a été refusée pour cette demande."message d'erreur lors de L'utilisation D'OWIN oAuth middleware (avec Auth séparé et le serveur de ressources)

j'essaie de découpler mon serveur d'auth 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 de mon démarrage.cs dans mon auth server:

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());

      }
   }
}

C'est le démarrage.cs dans 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);
      }      
   }
}

Quand je poste la requête suivante au point final "token " de mon serveur auth, je reçois avec succès un token:

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

lorsque je poste la requête suivante à mon contrôleur, je reçois le message d'erreur" Autorisation a été refusée pour cette requête"?

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 auth et d'api ressources / 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é que je le mentionnerais).

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

notez également que le I exécute les deux serveurs dans deux projets D'applications Web Visual Studio 2013 qui sont dans des solutions différentes VS 2013 qui fonctionnent sur des ports différents. Je ne suis pas sûr que cela importe, mais j'ai pensé que je le mentionnerais.

Merci d'avance.

23
demandé sur user1870738 2014-10-20 08:55:41

8 réponses

je faisais face exactement au même problème dans les 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 ajouter une touche machine à la fois web.fichiers de configuration et assurez-vous que que le même numéro de version des paquets installé dans les deux applications

3
répondu Islam El-Khayat 2015-05-10 16:44:21

vous devez enregistrer le Générateur de Tokens OAuth et les objets de consommation de Tokens OAuth avant le WebAPI est enregistré.

C'est en quelque sorte logique si vous pensez à cela comme à un pipeline, où L'Authentification/autorisation devrait précéder le traitement des requêtes par les contrôleurs.

TL;DR: Changement

appBuilder.UseWebApi(config);

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

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

appBuilder.UseWebApi(config);
23
répondu cguedel 2015-04-02 05:45:30

je recevais également le message d'erreur 'Autorisation a été refusée pour cette requête', bien que je n'ai pas de serveurs auth et de ressources séparés.

J'utilise OwinHost de Ninject et je l'ai configuré au 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 résolvait le problème, comme ceci:

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);
}

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

14
répondu gwhn 2014-10-24 22:24:51

dans mon post, j'ai été clair que vous devez Outrepasser le noeud machineKey pour les deux API (serveur D'autorisation et serveur de ressources) et partager la même machineKey entre les deux web.les fichiers de configuration. Comment accueillez-vous ces deux projets différents? ils sont sur la même machine ou des machines différentes? Revenez à l'étape 5 de la poste et de vérifier comment vous pouvez atteindre cet objectif.

4
répondu Taiseer Joudeh 2014-10-20 13:04:26

Pour moi, le problème était un mauvais numéro de version dans Owin packeges:

 <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 paquets requis, tout a fonctionné comme un charme. :)

3
répondu Kádi 2016-09-17 05:55:59

dans votre classe OwinStartup, IAppBuilder.UseOAuthBearerTokens () doit être appelé avant IAppBuilder.UseWebApi ()

public void Configuration(IAppBuilder app)
{
    app.UseOAuthBearerTokens(...);
    app.UseWebApi(...);
}
1
répondu Derek Comartin 2015-04-24 02:42:26

mise à jour du 6 juin 2018 - en utilisant les derniers paquets WebAPI et OWIN. Je me cogne la tête contre ce problème depuis plus longtemps que je ne voudrais l'admettre. Aucune des suggestions ci-dessus a fonctionné pour moi, les choses ont soudainement commencé à fonctionner une fois que j'ai ajouté une certaine dépendance de projet que je n'ai même pas l'utiliser dans mon code: Microsoft.Owin.Host.SystemWeb NuGet package. Je ne sais pas pourquoi ça marche 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/token était déjà configuré):

  • ajouter des références à Microsoft.Owin.Security.Oauth et Microsoft.Owin.Host.SystemWeb
  • créer une start-up.cs fichier 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{ });
            }
        }
    }
    
  • ajouter ce qui suit à votre Web.config le fichier <appSettings>

<add key="owin:appStartup" value="MyProject.Startup" />
1
répondu Mihai Coman 2018-06-06 15:34:28

j'ai eu le même message d'erreur. Comme j'apprenais L'Api Web pour la première fois, j'ai créé un projet avec le modèle D'Api Web, mais je n'ai pas cliqué sur le bouton D'authentification de changement. Je devrais avez sélectionné Aucune Authentification.

aussi, supprimer les attributs [Authorize] a fonctionné pour moi aussi.

[Authorize] <--Remove these attributes
public class ValuesController : ApiController
-2
répondu live-love 2016-12-15 15:32:48