asp.net - net - Aparece el mensaje de error "Se ha denegado la autorización para esta solicitud" al utilizar el middleware OWIN oAuth(con Auth y servidor de recursos separados)
token based authentication in web api 2 via owin (7)
Estoy intentando desacoplar mi auth y mi servidor de recursos. Estoy siguiendo el ejemplo proporcionado en este tutorial:
Este es el código en mi Startup.cs en mi servidor de autenticación:
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());
}
}
}
Este es el startup.cs en mi servidor de recursos (es decir, mi ejemplo de aplicación web api):
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);
}
}
}
Cuando publico la siguiente solicitud en el punto final "/ token" de mi servidor de autenticación, recibo un token con éxito:
{
access_token: "PszrzJUtQUhX42GMryWjZiVHuKiJ9yCVH_1tZURumtC5mTj2tpuRDF3tXcN_VNIYuXY40IG0K7W3KASfJ9DlNIU2jMOkL2U5oEAXLNRRQuNYdEJ7dMPb14nW19JIaM4BMk00xfQ8MFRw0p6-uoh0-e-Q6iAiTwDNN3F7bYMF9qm874qhLWEcOt6dWQgwpdDUVPDi7F07-Ck0zAs48Dg5w4q93vDpFaQMrziJg9aaxN8",
token_type: "bearer",
expires_in: 86399
}
Cuando publico la siguiente solicitud a mi controlador, ¿recibo el mensaje de error "Se ha denegado la autorización para esta solicitud"?
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
Mi servidor de autenticación y los proyectos de API de recursos / web están en diferentes soluciones y se ejecutan en diferentes puertos (... no estoy seguro si eso importa, pero pensé que lo mencionaría).
En este punto, estos 2 proyectos están utilizando middleware de OAuth OWIN (y tiene muy poco código personalizado). El middleware es Blackbox y solo necesito ayuda para entender por qué recibo este mensaje de error.
También tenga en cuenta que estoy ejecutando ambos servidores en dos proyectos de aplicaciones web de Visual Studio 2013 que están en diferentes soluciones de VS 2013 que se ejecutan en diferentes puertos. No estoy seguro si eso importa, pero pensé que lo mencionaría.
Gracias por adelantado.
Tengo el mismo error. Cuando estaba aprendiendo Web Api por primera vez, creé un proyecto con la plantilla de API web, pero no hice clic en el botón Cambiar autenticación. Debería haber seleccionado Sin Autenticación.
Además, la eliminación de los atributos [Autorizar] funcionó para mí también.
[Authorize] <--Remove these attributes
public class ValuesController : ApiController
En mi publicación, tuve claro que debe anular el nodo MachineKey para ambas API (servidor de autorización y servidor de recursos) y compartir la misma clave de máquina entre ambos archivos web.config. ¿Cómo se alojan esos 2 proyectos diferentes? están en la misma máquina o en diferentes máquinas? Vuelve al paso 5 de la publicación y comprueba cómo puedes lograrlo.
También recibí el mensaje de error "Se ha denegado la autorización para esta solicitud", aunque no tengo servidores de autenticación y recursos independientes.
Estoy usando Ninject''s OwinHost y lo configuré en Inicio antes de configurar OAuth, de la siguiente manera:
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);
}
Descubrí que mover la configuración de Ninject hasta el final resolvió el problema, así:
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);
}
Tal vez su problema tiene que ver con el orden de inicio de su middleware.
Me encontré con el mismo problema y encontré la solución:
Debe registrar las cosas del OAuth Token Generator y OAuth Token Consumer antes de que se registre WebAPI.
Algo tiene sentido si piensa en esto como una tubería, donde la Autenticación / Autorización debe venir antes de que los controladores manejen las solicitudes.
TL; DR: cambio
appBuilder.UseWebApi(config);
this.ConfigureOAuthTokenGenerator(appBuilder);
this.ConfigureOAuthConsumer(appBuilder);
A
this.ConfigureOAuthTokenGenerator(appBuilder);
this.ConfigureOAuthConsumer(appBuilder);
appBuilder.UseWebApi(config);
Estaba enfrentando exactamente el mismo problema en los últimos días, aunque alojé ambas aplicaciones en la misma máquina (diferentes puertos) pero no funcionó sin agregar la clave del equipo a ambos archivos web.config y me aseguré de que la misma versión de paquetes número instalado en ambas aplicaciones
Para mí, el problema era un número de versión no coincidente en los paquetes de 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>
Después de actualizar los paquetes anteriores necesarios, todo funcionó como un amuleto. :)
En su clase OwinStartup, IAppBuilder.UseOAuthBearerTokens () debe llamarse ANTES de IAppBuilder.UseWebApi ()
public void Configuration(IAppBuilder app)
{
app.UseOAuthBearerTokens(...);
app.UseWebApi(...);
}