Exemplo n.º 1
0
 public static ExpectedQueryValues Defaults(string authority)
 {
     var result = new ExpectedQueryValues(authority);
     result.Scope = OpenIdConnectScopes.OpenIdProfile;
     result.ResponseType = OpenIdConnectResponseTypes.CodeIdToken;
     return result;
 }
        public async Task ChallengeWillUseEvents()
        {
            var queryValues           = new ExpectedQueryValues(DefaultAuthority);
            var queryValuesSetInEvent = new ExpectedQueryValues(DefaultAuthority);
            var server = CreateServer(options =>
            {
                SetOptions(options, DefaultParameters(), queryValues);
                options.Events = new OpenIdConnectEvents()
                {
                    OnRedirectToAuthenticationEndpoint = context =>
                    {
                        context.ProtocolMessage.ClientId    = queryValuesSetInEvent.ClientId;
                        context.ProtocolMessage.RedirectUri = queryValuesSetInEvent.RedirectUri;
                        context.ProtocolMessage.Resource    = queryValuesSetInEvent.Resource;
                        context.ProtocolMessage.Scope       = queryValuesSetInEvent.Scope;
                        return(Task.FromResult <object>(null));
                    }
                };
            });

            var transaction = await SendAsync(server, DefaultHost + Challenge);

            Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode);
            queryValuesSetInEvent.CheckValues(transaction.Response.Headers.Location.AbsoluteUri, DefaultParameters());
        }
        public async Task ChallengeWillUseNotifications()
        {
            var queryValues = new ExpectedQueryValues(DefaultAuthority);
            var queryValuesSetInNotification = new ExpectedQueryValues(DefaultAuthority);
            var server = CreateServer(options =>
            {
                SetOptions(options, DefaultParameters(), queryValues);
                options.Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    RedirectToIdentityProvider = notification =>
                    {
                        notification.ProtocolMessage.ClientId    = queryValuesSetInNotification.ClientId;
                        notification.ProtocolMessage.RedirectUri = queryValuesSetInNotification.RedirectUri;
                        notification.ProtocolMessage.Resource    = queryValuesSetInNotification.Resource;
                        notification.ProtocolMessage.Scope       = queryValuesSetInNotification.Scope;
                        return(Task.FromResult <object>(null));
                    }
                };
            });

            var transaction = await SendAsync(server, DefaultHost + Challenge);

            transaction.Response.StatusCode.ShouldBe(HttpStatusCode.Redirect);
            queryValuesSetInNotification.CheckValues(transaction.Response.Headers.Location.AbsoluteUri, DefaultParameters());
        }
        public static ExpectedQueryValues Defaults(string authority)
        {
            var result = new ExpectedQueryValues(authority);

            result.Scope        = OpenIdConnectScopes.OpenIdProfile;
            result.ResponseType = OpenIdConnectResponseTypes.CodeIdToken;
            return(result);
        }
        public async Task ChallengeWillUseOptionsProperties()
        {
            var queryValues = new ExpectedQueryValues(DefaultAuthority);
            var server = CreateServer(options =>
            {
                SetOptions(options, DefaultParameters(), queryValues);
            });

            var transaction = await SendAsync(server, DefaultHost + Challenge);
            transaction.Response.StatusCode.ShouldBe(HttpStatusCode.Redirect);
            queryValues.CheckValues(transaction.Response.Headers.Location.AbsoluteUri, DefaultParameters());
        }
        public async Task ChallengeWillUseOptionsProperties()
        {
            var queryValues = new ExpectedQueryValues(DefaultAuthority);
            var server      = CreateServer(options =>
            {
                SetOptions(options, DefaultParameters(), queryValues);
            });

            var transaction = await SendAsync(server, DefaultHost + Challenge);

            transaction.Response.StatusCode.ShouldBe(HttpStatusCode.Redirect);
            queryValues.CheckValues(transaction.Response.Headers.Location.AbsoluteUri, DefaultParameters());
        }
        public async Task ChallengeWillSetDefaults()
        {
            var stateDataFormat = new AuthenticationPropertiesFormaterKeyValue();
            var queryValues     = ExpectedQueryValues.Defaults(DefaultAuthority);

            queryValues.State = OpenIdConnectAuthenticationDefaults.AuthenticationPropertiesKey + "=" + stateDataFormat.Protect(new AuthenticationProperties());
            var server = CreateServer(options =>
            {
                SetOptions(options, DefaultParameters(), queryValues);
            });

            var transaction = await SendAsync(server, DefaultHost + Challenge);

            transaction.Response.StatusCode.ShouldBe(HttpStatusCode.Redirect);
            queryValues.CheckValues(transaction.Response.Headers.Location.AbsoluteUri, DefaultParameters());
        }
        public async Task SignOutSettingMessage()
        {
            var configuration = new OpenIdConnectConfiguration
            {
                EndSessionEndpoint = ExpectedLogoutRequest
            };

            var queryValues = new ExpectedQueryValues(DefaultAuthority, configuration)
            {
                RequestType = OpenIdConnectRequestType.LogoutRequest
            };
            var server      = CreateServer(SetProtocolMessageOptions);
            var transaction = await SendAsync(server, DefaultHost + Signout);

            Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode);
            queryValues.CheckValues(transaction.Response.Headers.Location.AbsoluteUri, new string[] { });
        }
        public async Task ChallengeSettingMessage(string challenge, OpenIdConnectRequestType requestType)
        {
            var configuration = new OpenIdConnectConfiguration
            {
                AuthorizationEndpoint = ExpectedAuthorizeRequest,
                EndSessionEndpoint    = ExpectedLogoutRequest
            };

            var queryValues = new ExpectedQueryValues(DefaultAuthority, configuration)
            {
                RequestType = requestType
            };
            var server      = CreateServer(SetProtocolMessageOptions);
            var transaction = await SendAsync(server, DefaultHost + challenge);

            transaction.Response.StatusCode.ShouldBe(HttpStatusCode.Redirect);
            queryValues.CheckValues(transaction.Response.Headers.Location.AbsoluteUri, new string[] {});
        }
        public async Task ChallengeSettingState(string userState, string challenge)
        {
            var queryValues     = new ExpectedQueryValues(DefaultAuthority);
            var stateDataFormat = new AuthenticationPropertiesFormaterKeyValue();
            var properties      = new AuthenticationProperties();

            if (challenge == ChallengeWithProperties)
            {
                properties.Items.Add("item1", Guid.NewGuid().ToString());
            }

            var server = CreateServer(options =>
            {
                SetOptions(options, DefaultParameters(new string[] { OpenIdConnectParameterNames.State }), queryValues, stateDataFormat);
                options.AutomaticChallenge = challenge.Equals(ChallengeWithOutContext);
                options.Events             = new OpenIdConnectEvents()
                {
                    OnRedirectToAuthenticationEndpoint = context =>
                    {
                        context.ProtocolMessage.State       = userState;
                        context.ProtocolMessage.RedirectUri = queryValues.RedirectUri;
                        return(Task.FromResult <object>(null));
                    }
                };
            }, null, properties);

            var transaction = await SendAsync(server, DefaultHost + challenge);

            Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode);

            if (challenge != ChallengeWithProperties)
            {
                if (userState != null)
                {
                    properties.Items.Add(OpenIdConnectDefaults.UserstatePropertiesKey, userState);
                }
                properties.Items.Add(OpenIdConnectDefaults.RedirectUriForCodePropertiesKey, queryValues.RedirectUri);
            }

            queryValues.State = stateDataFormat.Protect(properties);
            queryValues.CheckValues(transaction.Response.Headers.Location.AbsoluteUri, DefaultParameters(new string[] { OpenIdConnectParameterNames.State }));
        }
        public async Task ChallengeWillUseNotifications()
        {
            var queryValues = new ExpectedQueryValues(DefaultAuthority);
            var queryValuesSetInNotification = new ExpectedQueryValues(DefaultAuthority);
            var server = CreateServer(options =>
            {
                SetOptions(options, DefaultParameters(), queryValues);
                options.Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    RedirectToIdentityProvider = notification =>
                    {
                        notification.ProtocolMessage.ClientId = queryValuesSetInNotification.ClientId;
                        notification.ProtocolMessage.RedirectUri = queryValuesSetInNotification.RedirectUri;
                        notification.ProtocolMessage.Resource = queryValuesSetInNotification.Resource;
                        notification.ProtocolMessage.Scope = queryValuesSetInNotification.Scope;
                        return Task.FromResult<object>(null);
                    }
                };
            });

            var transaction = await SendAsync(server, DefaultHost + Challenge);
            transaction.Response.StatusCode.ShouldBe(HttpStatusCode.Redirect);
            queryValuesSetInNotification.CheckValues(transaction.Response.Headers.Location.AbsoluteUri, DefaultParameters());
        }
        private void SetOptions(OpenIdConnectOptions options, List<string> parameters, ExpectedQueryValues queryValues, ISecureDataFormat<AuthenticationProperties> secureDataFormat = null)
        {
            foreach (var param in parameters)
            {
                if (param.Equals(OpenIdConnectParameterNames.ClientId))
                    options.ClientId = queryValues.ClientId;
                else if (param.Equals(OpenIdConnectParameterNames.Resource))
                    options.Resource = queryValues.Resource;
                else if (param.Equals(OpenIdConnectParameterNames.Scope)) {
                    options.Scope.Clear();

                    foreach (var scope in queryValues.Scope.Split(' ')) {
                        options.Scope.Add(scope);
                    }
                }
            }

            options.Authority = queryValues.Authority;
            options.Configuration = queryValues.Configuration;
            options.StateDataFormat = secureDataFormat ?? new AuthenticationPropertiesFormaterKeyValue();
        }
        public async Task ChallengeWillUseEvents()
        {
            var queryValues = new ExpectedQueryValues(DefaultAuthority);
            var queryValuesSetInEvent = new ExpectedQueryValues(DefaultAuthority);
            var server = CreateServer(options =>
            {
                SetOptions(options, DefaultParameters(), queryValues);
                options.Events = new OpenIdConnectEvents()
                {
                    OnRedirectToAuthenticationEndpoint = context =>
                    {
                        context.ProtocolMessage.ClientId = queryValuesSetInEvent.ClientId;
                        context.ProtocolMessage.RedirectUri = queryValuesSetInEvent.RedirectUri;
                        context.ProtocolMessage.Resource = queryValuesSetInEvent.Resource;
                        context.ProtocolMessage.Scope = queryValuesSetInEvent.Scope;
                        return Task.FromResult<object>(null);
                    }
                };
            });

            var transaction = await SendAsync(server, DefaultHost + Challenge);
            Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode);
            queryValuesSetInEvent.CheckValues(transaction.Response.Headers.Location.AbsoluteUri, DefaultParameters());
        }
        public async Task ChallengeSettingState(string userState, string challenge)
        {
            var queryValues = new ExpectedQueryValues(DefaultAuthority);
            var stateDataFormat = new AuthenticationPropertiesFormaterKeyValue();
            var properties = new AuthenticationProperties();
            if (challenge == ChallengeWithProperties)
            {
                properties.Items.Add("item1", Guid.NewGuid().ToString());
            }

            var server = CreateServer(options =>
            {
                SetOptions(options, DefaultParameters(new string[] { OpenIdConnectParameterNames.State }), queryValues, stateDataFormat);
                options.AutomaticChallenge = challenge.Equals(ChallengeWithOutContext);
                options.Events = new OpenIdConnectEvents()
                {
                    OnRedirectToAuthenticationEndpoint = context =>
                    {
                        context.ProtocolMessage.State = userState;
                        context.ProtocolMessage.RedirectUri = queryValues.RedirectUri;
                        return Task.FromResult<object>(null);
                    }

                };
            }, null, properties);

            var transaction = await SendAsync(server, DefaultHost + challenge);
            Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode);

            if (challenge != ChallengeWithProperties)
            {
                if (userState != null)
                {
                    properties.Items.Add(OpenIdConnectDefaults.UserstatePropertiesKey, userState);
                }
                properties.Items.Add(OpenIdConnectDefaults.RedirectUriForCodePropertiesKey, queryValues.RedirectUri);
            }

            queryValues.State = stateDataFormat.Protect(properties);
            queryValues.CheckValues(transaction.Response.Headers.Location.AbsoluteUri, DefaultParameters(new string[] { OpenIdConnectParameterNames.State }));
        }
        public async Task SignOutSettingMessage()
        {
            var configuration = new OpenIdConnectConfiguration
            {
                EndSessionEndpoint = ExpectedLogoutRequest
            };

            var queryValues = new ExpectedQueryValues(DefaultAuthority, configuration)
            {
                RequestType = OpenIdConnectRequestType.LogoutRequest
            };
            var server = CreateServer(SetProtocolMessageOptions);
            var transaction = await SendAsync(server, DefaultHost + Signout);
            Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode);
            queryValues.CheckValues(transaction.Response.Headers.Location.AbsoluteUri, new string[] { });
        }
        public async Task ChallengeSettingMessage(string challenge, OpenIdConnectRequestType requestType)
        {
            var configuration = new OpenIdConnectConfiguration
            {
                AuthorizationEndpoint = ExpectedAuthorizeRequest,
                EndSessionEndpoint = ExpectedLogoutRequest
            };

            var queryValues = new ExpectedQueryValues(DefaultAuthority, configuration)
            {
                RequestType = requestType
            };
            var server = CreateServer(SetProtocolMessageOptions);
            var transaction = await SendAsync(server, DefaultHost + challenge);
            transaction.Response.StatusCode.ShouldBe(HttpStatusCode.Redirect);
            queryValues.CheckValues(transaction.Response.Headers.Location.AbsoluteUri, new string[] {});
        }
        private void SetOptions(OpenIdConnectAuthenticationOptions options, List <string> parameters, ExpectedQueryValues queryValues, ISecureDataFormat <AuthenticationProperties> secureDataFormat = null)
        {
            foreach (var param in parameters)
            {
                if (param.Equals(OpenIdConnectParameterNames.ClientId))
                {
                    options.ClientId = queryValues.ClientId;
                }
                else if (param.Equals(OpenIdConnectParameterNames.RedirectUri))
                {
                    options.RedirectUri = queryValues.RedirectUri;
                }
                else if (param.Equals(OpenIdConnectParameterNames.Resource))
                {
                    options.Resource = queryValues.Resource;
                }
                else if (param.Equals(OpenIdConnectParameterNames.Scope))
                {
                    options.Scope = queryValues.Scope;
                }
            }

            options.Authority       = queryValues.Authority;
            options.Configuration   = queryValues.Configuration;
            options.StateDataFormat = secureDataFormat ?? new AuthenticationPropertiesFormaterKeyValue();
        }