Beispiel #1
0
        public async Task ChallengeThrowsForSchemeMismatch()
        {
            var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o =>
            {
                o.AddScheme <BaseHandler>("base", "whatever");
            }).BuildServiceProvider();
            var context = new DefaultHttpContext();

            context.RequestServices = services;

            await context.ChallengeAsync("base");

            var ex = await Assert.ThrowsAsync <InvalidOperationException>(() => context.ChallengeAsync("missing"));

            Assert.Contains("base", ex.Message);
        }
Beispiel #2
0
        public async Task NullForwardSelectorUsesDefault()
        {
            var services = new ServiceCollection().AddLogging();

            services.AddAuthentication(o =>
            {
                o.DefaultScheme = MicrosoftAccountDefaults.AuthenticationScheme;
                o.AddScheme <TestHandler2>("auth1", "auth1");
                o.AddScheme <TestHandler3>("selector", "selector");
                o.AddScheme <TestHandler>("specific", "specific");
            })
            .AddMicrosoftAccount(o =>
            {
                ConfigureDefaults(o);
                o.ForwardDefault         = "auth1";
                o.ForwardDefaultSelector = _ => null;
            });

            var specific = new TestHandler();

            services.AddSingleton(specific);
            var forwardDefault = new TestHandler2();

            services.AddSingleton(forwardDefault);
            var selector = new TestHandler3();

            services.AddSingleton(selector);

            var sp      = services.BuildServiceProvider();
            var context = new DefaultHttpContext();

            context.RequestServices = sp;

            await context.AuthenticateAsync();

            Assert.Equal(1, forwardDefault.AuthenticateCount);

            await context.ForbidAsync();

            Assert.Equal(1, forwardDefault.ForbidCount);

            await context.ChallengeAsync();

            Assert.Equal(1, forwardDefault.ChallengeCount);

            await Assert.ThrowsAsync <InvalidOperationException>(() => context.SignOutAsync());

            await Assert.ThrowsAsync <InvalidOperationException>(() => context.SignInAsync(new ClaimsPrincipal()));

            Assert.Equal(0, selector.AuthenticateCount);
            Assert.Equal(0, selector.ForbidCount);
            Assert.Equal(0, selector.ChallengeCount);
            Assert.Equal(0, selector.SignInCount);
            Assert.Equal(0, selector.SignOutCount);
            Assert.Equal(0, specific.AuthenticateCount);
            Assert.Equal(0, specific.ForbidCount);
            Assert.Equal(0, specific.ChallengeCount);
            Assert.Equal(0, specific.SignInCount);
            Assert.Equal(0, specific.SignOutCount);
        }
Beispiel #3
0
        public async Task VirtualSchemeTargetsForwardWithDefaultTarget()
        {
            var services = new ServiceCollection().AddOptions().AddLogging();

            services.AddAuthentication(o =>
            {
                o.AddScheme <TestHandler>("auth1", "auth1");
                o.AddScheme <TestHandler2>("auth2", "auth2");
            })
            .AddPolicyScheme("forward", "forward", p => p.ForwardDefault = "auth1");

            var handler1 = new TestHandler();

            services.AddSingleton(handler1);
            var handler2 = new TestHandler2();

            services.AddSingleton(handler2);

            var sp      = services.BuildServiceProvider();
            var context = new DefaultHttpContext();

            context.RequestServices = sp;

            Assert.Equal(0, handler1.AuthenticateCount);
            Assert.Equal(0, handler1.ForbidCount);
            Assert.Equal(0, handler1.ChallengeCount);
            Assert.Equal(0, handler1.SignInCount);
            Assert.Equal(0, handler1.SignOutCount);
            Assert.Equal(0, handler2.AuthenticateCount);
            Assert.Equal(0, handler2.ForbidCount);
            Assert.Equal(0, handler2.ChallengeCount);
            Assert.Equal(0, handler2.SignInCount);
            Assert.Equal(0, handler2.SignOutCount);

            await context.AuthenticateAsync("forward");

            Assert.Equal(1, handler1.AuthenticateCount);
            Assert.Equal(0, handler2.AuthenticateCount);

            await context.ForbidAsync("forward");

            Assert.Equal(1, handler1.ForbidCount);
            Assert.Equal(0, handler2.ForbidCount);

            await context.ChallengeAsync("forward");

            Assert.Equal(1, handler1.ChallengeCount);
            Assert.Equal(0, handler2.ChallengeCount);

            await context.SignOutAsync("forward");

            Assert.Equal(1, handler1.SignOutCount);
            Assert.Equal(0, handler2.SignOutCount);

            await context.SignInAsync("forward", new ClaimsPrincipal());

            Assert.Equal(1, handler1.SignInCount);
            Assert.Equal(0, handler2.SignInCount);
        }
Beispiel #4
0
        public async Task CanForwardDefault()
        {
            var services = new ServiceCollection().AddLogging();

            services.AddAuthentication(o =>
            {
                o.DefaultScheme = OpenIdConnectDefaults.AuthenticationScheme;
                o.AddScheme <TestHandler>("auth1", "auth1");
            })
            .AddOpenIdConnect(o =>
            {
                ConfigureDefaults(o);
                o.ForwardDefault = "auth1";
            });

            var forwardDefault = new TestHandler();

            services.AddSingleton(forwardDefault);

            var sp      = services.BuildServiceProvider();
            var context = new DefaultHttpContext();

            context.RequestServices = sp;

            Assert.Equal(0, forwardDefault.AuthenticateCount);
            Assert.Equal(0, forwardDefault.ForbidCount);
            Assert.Equal(0, forwardDefault.ChallengeCount);
            Assert.Equal(0, forwardDefault.SignInCount);
            Assert.Equal(0, forwardDefault.SignOutCount);

            await context.AuthenticateAsync();

            Assert.Equal(1, forwardDefault.AuthenticateCount);

            await context.ForbidAsync();

            Assert.Equal(1, forwardDefault.ForbidCount);

            await context.ChallengeAsync();

            Assert.Equal(1, forwardDefault.ChallengeCount);

            await context.SignOutAsync();

            Assert.Equal(1, forwardDefault.SignOutCount);

            await Assert.ThrowsAsync <InvalidOperationException>(() => context.SignInAsync(new ClaimsPrincipal()));
        }
Beispiel #5
0
        public async Task ForwardChallengeWinsOverDefault()
        {
            var services = new ServiceCollection().AddLogging();

            services.AddAuthentication(o =>
            {
                o.DefaultScheme       = "default";
                o.DefaultSignInScheme = "auth1";
                o.AddScheme <TestHandler>("specific", "specific");
                o.AddScheme <TestHandler2>("auth1", "auth1");
            })
            .AddOAuth("default", o =>
            {
                ConfigureDefaults(o);
                o.ForwardDefault   = "auth1";
                o.ForwardChallenge = "specific";
            });

            var specific = new TestHandler();

            services.AddSingleton(specific);
            var forwardDefault = new TestHandler2();

            services.AddSingleton(forwardDefault);

            var sp      = services.BuildServiceProvider();
            var context = new DefaultHttpContext();

            context.RequestServices = sp;

            await context.ChallengeAsync();

            Assert.Equal(0, specific.SignOutCount);
            Assert.Equal(0, specific.AuthenticateCount);
            Assert.Equal(0, specific.ForbidCount);
            Assert.Equal(1, specific.ChallengeCount);
            Assert.Equal(0, specific.SignInCount);

            Assert.Equal(0, forwardDefault.AuthenticateCount);
            Assert.Equal(0, forwardDefault.ForbidCount);
            Assert.Equal(0, forwardDefault.ChallengeCount);
            Assert.Equal(0, forwardDefault.SignInCount);
            Assert.Equal(0, forwardDefault.SignOutCount);
        }
Beispiel #6
0
        public async Task ServicesWithDefaultSignInMethodsTest()
        {
            var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o =>
            {
                o.AddScheme <SignInHandler>("base", "whatever");
                o.DefaultScheme = "base";
            }).BuildServiceProvider();
            var context = new DefaultHttpContext();

            context.RequestServices = services;

            await context.AuthenticateAsync();

            await context.ChallengeAsync();

            await context.ForbidAsync();

            await context.SignOutAsync();

            await context.SignInAsync(new ClaimsPrincipal(new ClaimsIdentity("whatever")));
        }
        public async Task ServicesWithDefaultIAuthenticationHandlerMethodsTest()
        {
            var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o =>
            {
                o.AddScheme <BaseHandler>("base", "whatever");
                o.DefaultScheme = "base";
            }).BuildServiceProvider();
            var context = new DefaultHttpContext();

            context.RequestServices = services;

            await context.AuthenticateAsync();

            await context.ChallengeAsync();

            await context.ForbidAsync();

            await Assert.ThrowsAsync <InvalidOperationException>(() => context.SignOutAsync());

            await Assert.ThrowsAsync <InvalidOperationException>(() => context.SignInAsync(new ClaimsPrincipal()));
        }
Beispiel #8
0
        public async Task SpecificTargetAlwaysWinsOverDefaultTarget()
        {
            var services = new ServiceCollection().AddOptions().AddLogging();

            services.AddAuthentication(o =>
            {
                o.AddScheme <TestHandler>("auth1", "auth1");
                o.AddScheme <TestHandler2>("auth2", "auth2");
            })
            .AddPolicyScheme("forward", "forward", p => {
                p.ForwardDefault         = "auth2";
                p.ForwardDefaultSelector = ctx => "auth2";
                p.ForwardAuthenticate    = "auth1";
                p.ForwardSignIn          = "auth1";
                p.ForwardSignOut         = "auth1";
                p.ForwardForbid          = "auth1";
                p.ForwardChallenge       = "auth1";
            });

            var handler1 = new TestHandler();

            services.AddSingleton(handler1);
            var handler2 = new TestHandler2();

            services.AddSingleton(handler2);

            var sp      = services.BuildServiceProvider();
            var context = new DefaultHttpContext();

            context.RequestServices = sp;

            Assert.Equal(0, handler1.AuthenticateCount);
            Assert.Equal(0, handler1.ForbidCount);
            Assert.Equal(0, handler1.ChallengeCount);
            Assert.Equal(0, handler1.SignInCount);
            Assert.Equal(0, handler1.SignOutCount);
            Assert.Equal(0, handler2.AuthenticateCount);
            Assert.Equal(0, handler2.ForbidCount);
            Assert.Equal(0, handler2.ChallengeCount);
            Assert.Equal(0, handler2.SignInCount);
            Assert.Equal(0, handler2.SignOutCount);

            await context.AuthenticateAsync("forward");

            Assert.Equal(1, handler1.AuthenticateCount);
            Assert.Equal(0, handler2.AuthenticateCount);

            await context.ForbidAsync("forward");

            Assert.Equal(1, handler1.ForbidCount);
            Assert.Equal(0, handler2.ForbidCount);

            await context.ChallengeAsync("forward");

            Assert.Equal(1, handler1.ChallengeCount);
            Assert.Equal(0, handler2.ChallengeCount);

            await context.SignOutAsync("forward");

            Assert.Equal(1, handler1.SignOutCount);
            Assert.Equal(0, handler2.SignOutCount);

            await context.SignInAsync("forward", new ClaimsPrincipal(new ClaimsIdentity("whatever")));

            Assert.Equal(1, handler1.SignInCount);
            Assert.Equal(0, handler2.SignInCount);
        }
Beispiel #9
0
    public async Task SpecificForwardWinsOverSelectorAndDefault()
    {
        var services = new ServiceCollection().AddLogging();
        var builder  = services.AddAuthentication(o =>
        {
            o.DefaultScheme = DefaultScheme;
            o.AddScheme <TestHandler2>("auth1", "auth1");
            o.AddScheme <TestHandler3>("selector", "selector");
            o.AddScheme <TestHandler>("specific", "specific");
        });

        RegisterAuth(builder, o =>
        {
            o.ForwardDefault         = "auth1";
            o.ForwardDefaultSelector = _ => "selector";
            o.ForwardAuthenticate    = "specific";
            o.ForwardChallenge       = "specific";
            o.ForwardSignIn          = "specific";
            o.ForwardSignOut         = "specific";
            o.ForwardForbid          = "specific";
        });

        var specific = new TestHandler();

        services.AddSingleton(specific);
        var forwardDefault = new TestHandler2();

        services.AddSingleton(forwardDefault);
        var selector = new TestHandler3();

        services.AddSingleton(selector);

        var sp      = services.BuildServiceProvider();
        var context = new DefaultHttpContext();

        context.RequestServices = sp;

        await context.AuthenticateAsync();

        Assert.Equal(1, specific.AuthenticateCount);

        await context.ForbidAsync();

        Assert.Equal(1, specific.ForbidCount);

        await context.ChallengeAsync();

        Assert.Equal(1, specific.ChallengeCount);

        if (SupportsSignOut)
        {
            await context.SignOutAsync();

            Assert.Equal(1, specific.SignOutCount);
        }
        else
        {
            await Assert.ThrowsAsync <InvalidOperationException>(() => context.SignOutAsync());
        }

        if (SupportsSignIn)
        {
            await context.SignInAsync(new ClaimsPrincipal(new ClaimsIdentity("whatever")));

            Assert.Equal(1, specific.SignInCount);
        }
        else
        {
            await Assert.ThrowsAsync <InvalidOperationException>(() => context.SignInAsync(new ClaimsPrincipal()));
        }

        Assert.Equal(0, forwardDefault.AuthenticateCount);
        Assert.Equal(0, forwardDefault.ForbidCount);
        Assert.Equal(0, forwardDefault.ChallengeCount);
        Assert.Equal(0, forwardDefault.SignInCount);
        Assert.Equal(0, forwardDefault.SignOutCount);
        Assert.Equal(0, selector.AuthenticateCount);
        Assert.Equal(0, selector.ForbidCount);
        Assert.Equal(0, selector.ChallengeCount);
        Assert.Equal(0, selector.SignInCount);
        Assert.Equal(0, selector.SignOutCount);
    }
Beispiel #10
0
    public async Task CanForwardDefault()
    {
        var services = new ServiceCollection().AddLogging();

        var builder = services.AddAuthentication(o =>
        {
            o.DefaultScheme = DefaultScheme;
            o.AddScheme <TestHandler>("auth1", "auth1");
        });

        RegisterAuth(builder, o => o.ForwardDefault = "auth1");

        var forwardDefault = new TestHandler();

        services.AddSingleton(forwardDefault);

        var sp      = services.BuildServiceProvider();
        var context = new DefaultHttpContext();

        context.RequestServices = sp;

        Assert.Equal(0, forwardDefault.AuthenticateCount);
        Assert.Equal(0, forwardDefault.ForbidCount);
        Assert.Equal(0, forwardDefault.ChallengeCount);
        Assert.Equal(0, forwardDefault.SignInCount);
        Assert.Equal(0, forwardDefault.SignOutCount);

        await context.AuthenticateAsync();

        Assert.Equal(1, forwardDefault.AuthenticateCount);

        await context.ForbidAsync();

        Assert.Equal(1, forwardDefault.ForbidCount);

        await context.ChallengeAsync();

        Assert.Equal(1, forwardDefault.ChallengeCount);

        if (SupportsSignOut)
        {
            await context.SignOutAsync();

            Assert.Equal(1, forwardDefault.SignOutCount);
        }
        else
        {
            await Assert.ThrowsAsync <InvalidOperationException>(() => context.SignOutAsync());
        }

        if (SupportsSignIn)
        {
            await context.SignInAsync(new ClaimsPrincipal(new ClaimsIdentity("whatever")));

            Assert.Equal(1, forwardDefault.SignInCount);
        }
        else
        {
            await Assert.ThrowsAsync <InvalidOperationException>(() => context.SignInAsync(new ClaimsPrincipal()));
        }
    }