Аутентификация ASP.Net с OAuth и ADFS в зависимости от пути - PullRequest
0 голосов
/ 09 января 2019

У нас есть сайт ASP.Net, который требует аутентификации. Я реализовал код ниже.

Приложению требуется аутентификация по следующим путям:

/admin     - ADFS
/edx/links - ADFS
/api       - OAuth

Api используется приложением и должно проходить проверку подлинности с помощью OAuth, а не ADFS, но, тем не менее, приложение перенаправляется на сервер ADFS.

Можем ли мы сделать то, что описано на 1 сайте, или мы должны разделить сайт на две части (1 для веб-доступа и API)? Я бы предпочел вариант с 1 сайтом.

public void Configuration(IAppBuilder app)
    {
        app.UseOwinExceptionLogger();
        app.SetLoggerFactory(new OwinLoggerFactory());

        var config = new HttpConfiguration { DependencyResolver = new StructureMapResolver(Container) };
        var settings = Container.GetInstance<ISettings>();

        ConfigureOAuth(app, settings);
        app.Map("/admin", inner => ConfigureAuth(inner, settings));
        app.Map("/edx/links", inner => ConfigureAuth(inner, settings));

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

    private static void ConfigureOAuth(IAppBuilder app, ISettings settings)
    {
        var oAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(20),
            Provider = new SimpleAuthorizationServerProvider(),
            RefreshTokenProvider = new SimpleRefreshTokenProvider(),
        };

        // Token Generation
        app.UseOAuthAuthorizationServer(oAuthServerOptions);

        app.Use(async (context, next) => { await next.Invoke(); });
    }

    private void ConfigureAuth(IAppBuilder app, ISettings settings)
    {
        // Work-around to fix Katana issue 197: https://katanaproject.codeplex.com/workitem/197
        // https://github.com/KentorIT/owin-cookie-saver
        // app.UseKentorOwinCookieSaver();
        app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType,
            CookieManager = new SystemWebCookieManager()
        });

        app.UseWsFederationAuthentication(
            new WsFederationAuthenticationOptions
            {
                Wtrealm = settings.WsFedRealm,
                MetadataAddress = settings.WsFedMetadataUrl,
                TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = ClaimsExtensions.WurNameIdentifier,
                    SaveSigninToken = true
                },
                Notifications = new WsFederationAuthenticationNotifications
                {
                    MessageReceived = context =>
                    {
                        Log.Info($"Message received {context.ProtocolMessage}");
                        return Task.FromResult(0);
                    },
                    RedirectToIdentityProvider = context =>
                    {
                        Log.Info($"Redirect to identity provider {context?.Request?.Uri?.AbsolutePath}");
                        return Task.FromResult(0);
                    },
                    SecurityTokenValidated = context =>
                    {
                        Log.Info("Security token validated");
                        return Task.FromResult(0);
                    },
                    SecurityTokenReceived = context =>
                    {
                        Log.Info($"SecurityTokenReceived {context?.Response?.ReasonPhrase}");
                        return Task.FromResult(0);
                    },
                    AuthenticationFailed = context =>
                    {
                        context.HandleResponse();
                        context.Response.Redirect("~/Error?message=" + context.Exception.Message);
                        return Task.FromResult(0);
                    }
                }
            });

        AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Name;
    }
...