asp.net - with - web api token authentication



OAuth Calling TokenEndpointPath führt zu Der Controller für den Pfad wurde nicht gefunden (0)

Befolgte dieses Handbuch und erstellte Token-Authentifizierung. Es funktioniert perfekt im Debug-Modus, aber im Freigabemodus führt ein Aufruf zum TokenEndpointPath

Der Controller für den Pfad '/ bps / oauth / token' wurde nicht gefunden oder implementiert IController nicht.

Der URI hat den / bps / Teil wegen der WebBaseUri in der Datei Web.config.

<appSettings>
<add key="WebBaseUrl" value="/bps/" />
<add key="WebApiBaseUrl" value="/api/" />
<add key="owin:AutomaticAppStartup" value="true" />
<add key="LoginErrorMessage" value="Login or email is wrong" />

Die Startup-Klasse folgt:

    public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Use<OwinExceptionHandlerMiddleware>();

        var container = new WindsorContainer().Install(new WindsorInstaller());
        container.Register(Component.For<IAppBuilder>().Instance(app));
        var httpDependencyResolver = new WindsorHttpDependencyResolver(container);

        HttpConfiguration config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();

        config.DependencyResolver = httpDependencyResolver;
        app.CreatePerOwinContext(() => container.Resolve<ApplicationUserManager>());
        GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new WindsorControllerActivator(container));


        ConfigureOAuthTokenGeneration(app, container);

        ConfigureOAuthTokenConsumption(app);

        app.UseWebApi(config);
    }

    private void ConfigureOAuthTokenGeneration(IAppBuilder app, IWindsorContainer container)
    {
        var OAuthServerOptions = new OAuthAuthorizationServerOptions
        {
            //For Dev enviroment only (on production should be AllowInsecureHttp = false)
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/oauth/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
            Provider = container.Resolve<IOAuthAuthorizationServerProvider>(),
            AccessTokenFormat = container.Resolve<CustomJwtFormat>(),
        };

        app.UseOAuthAuthorizationServer(OAuthServerOptions);
    }

    private void ConfigureOAuthTokenConsumption(IAppBuilder app)
    {
        var issuer = ConfigurationManager.AppSettings["ServerAddress"];
        string audienceId = ConfigurationManager.AppSettings["AudienceId"];
        byte[] audienceSecret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["AudienceSecret"]);

        // Api controllers with an [Authorize] attribute will be validated with JWT
        app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                AuthenticationMode = AuthenticationMode.Active,
                AllowedAudiences = new[] { audienceId },
                IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
                {
                    new SymmetricKeyIssuerSecurityTokenProvider(issuer, audienceSecret)
                }
            });
    }
}

Dies ist die Implementierung des IOAuthAuthorizationServerProvider, der für die Provider- Eigenschaft aufgelöst wird:

    public class OAuthService : OAuthAuthorizationServerProvider
{
    private readonly IApplicationUserService _userService;
    private readonly ICredentialsValidatior _credentialsValidatior;

    public OAuthService(IApplicationUserService userService, ICredentialsValidatior credentialsValidatior)
    {
        this._userService = userService;
        _credentialsValidatior = credentialsValidatior;
    }

    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        context.Validated();
        return Task.FromResult<object>(null);
    }

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        var allowedOrigin = context.OwinContext.Get<string>("as:clientAllowedOrigin");
        if (allowedOrigin == null) allowedOrigin = "*";
        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin });

        /* Some user validation logick */

        var user = await _userService.FindByNameAsync(context.UserName);

        ClaimsIdentity oAuthIdentity = await GenerateUserIdentityAsync(user);

        var ticket = new AuthenticationTicket(oAuthIdentity, null);

        context.Validated(ticket);
    }

    private async Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUser user)
    {
        const string authenticationType = "JWT";
        var userIdentity = await _userService.CreateIdentityAsync(user, authenticationType);

        return userIdentity;
    }
}

Klasse, die für die AccessTokenFormat- Eigenschaft aufgelöst wird:

    public class CustomJwtFormat : ISecureDataFormat<AuthenticationTicket>
{
    private readonly string _issuer;

    public CustomJwtFormat(string issuer)
    {
        _issuer = issuer;
    }

    public string Protect(AuthenticationTicket data)
    {
        if (data == null)
        {
            throw new ArgumentNullException("data");
        }

        string audienceId = ConfigurationManager.AppSettings["AudienceId"];

        string symmetricKeyAsBase64 = ConfigurationManager.AppSettings["AudienceSecret"];

        var keyByteArray = TextEncodings.Base64Url.Decode(symmetricKeyAsBase64);

        var signingKey = new HmacSigningCredentials(keyByteArray);

        var issued = data.Properties.IssuedUtc;

        var expires = data.Properties.ExpiresUtc;

        var token = new JwtSecurityToken(_issuer, audienceId, data.Identity.Claims, issued.Value.UtcDateTime, expires.Value.UtcDateTime, signingKey);

        var handler = new JwtSecurityTokenHandler();

        var jwt = handler.WriteToken(token);

        return jwt;
    }

    public AuthenticationTicket Unprotect(string protectedText)
    {
        throw new NotImplementedException();
    }
}

Dieser Code wird auf meinem lokalen Computer ausgeführt und funktioniert im Debug- und im Release-Modus einwandfrei.

Das Problem tritt auf, wenn dieser Code im Debugmodus auf dem Entwicklungsserver veröffentlicht wird.

Ich habe herausgefunden, dass das Umschalten der AllowInsecureHttp- Eigenschaft auf false auf dem lokalen Computer zu diesem Fehler führt, die Version auf dem Dev-Server jedoch genau gleich ist. Ich habe den IL-Code überprüft und die AllowInsecureHttp- Eigenschaft auf 1 gesetzt.

AKTUALISIEREN

Ich habe versucht, den / bps / Teil zum TokenEndpointPath hinzuzufügen, aber es hat nicht geholfen.

Aus unbekannten Gründen funktioniert es jetzt nicht einmal lokal. Ich habe herausgefunden, dass die Einstellungen des Projekts so sind

Ich habe versucht, diese Einstellungen auf dem Dev-Server zu finden, leider habe ich wegen des fehlenden Wissens über IIS nichts gefunden.

Ich habe auch versucht, die OWIN-Pipeline zu überprüfen und herausgefunden, dass die URL, die durch die Pipeline geleitet wird, dieselbe ist, die in der Startup.cs konfiguriert ist.

Ich habe diese Frage auch im StackOverflow gefunden.





access-token