Esempio n. 1
0
        public void ProcessAsync_when_valiationresult_client_null_exect_exception()
        {
            var         validationResult = new DeviceAuthorizationRequestValidationResult(new ValidatedDeviceAuthorizationRequest());
            Func <Task> act = () => generator.ProcessAsync(validationResult, TestBaseUrl);

            act.Should().Throw <ArgumentNullException>();
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="DeviceAuthorizationSuccessEvent"/> class.
 /// </summary>
 /// <param name="response">The response.</param>
 /// <param name="request">The request.</param>
 public DeviceAuthorizationSuccessEvent(DeviceAuthorizationResponse response, DeviceAuthorizationRequestValidationResult request)
     : this()
 {
     ClientId   = request.ValidatedRequest.Client?.ClientId;
     ClientName = request.ValidatedRequest.Client?.ClientName;
     Endpoint   = Constants.EndpointNames.DeviceAuthorization;
     Scopes     = request.ValidatedRequest.ValidatedResources?.RawScopeValues.ToSpaceSeparatedString();
 }
        /// <summary>
        /// Initializes a new instance of the <see cref="DeviceAuthorizationFailureEvent"/> class.
        /// </summary>
        /// <param name="result">The result.</param>
        public DeviceAuthorizationFailureEvent(DeviceAuthorizationRequestValidationResult result)
            : this()
        {
            if (result.ValidatedRequest != null)
            {
                ClientId   = result.ValidatedRequest.Client?.ClientId;
                ClientName = result.ValidatedRequest.Client?.ClientName;
                Scopes     = result.ValidatedRequest.RequestedScopes?.ToSpaceSeparatedString();
            }

            Endpoint         = Constants.EndpointNames.DeviceAuthorization;
            Error            = result.Error;
            ErrorDescription = result.ErrorDescription;
        }
Esempio n. 4
0
        public DeviceAuthorizationResponseGeneratorTests()
        {
            testResult = new DeviceAuthorizationRequestValidationResult(new ValidatedDeviceAuthorizationRequest
            {
                Client = new Client {
                    ClientId = Guid.NewGuid().ToString()
                },
                IsOpenIdRequest    = true,
                ValidatedResources = new ResourceValidationResult()
            });

            generator = new DeviceAuthorizationResponseGenerator(
                options,
                new DefaultUserCodeService(new IUserCodeGenerator[] { new NumericUserCodeGenerator(), fakeUserCodeGenerator }),
                deviceFlowCodeService,
                clock,
                new NullLogger <DeviceAuthorizationResponseGenerator>());
        }
        private void LogResponse(DeviceAuthorizationResponse response, DeviceAuthorizationRequestValidationResult requestResult)
        {
            var clientId = $"{requestResult.ValidatedRequest.Client.ClientId} ({requestResult.ValidatedRequest.Client?.ClientName ?? "no name set"})";

            if (response.DeviceCode != null)
            {
                _logger.LogTrace("Device code issued for {clientId}: {deviceCode}", clientId, response.DeviceCode);
            }
            if (response.UserCode != null)
            {
                _logger.LogTrace("User code issued for {clientId}: {userCode}", clientId, response.UserCode);
            }
            if (response.VerificationUri != null)
            {
                _logger.LogTrace("Verification URI issued for {clientId}: {verificationUri}", clientId, response.VerificationUri);
            }
            if (response.VerificationUriComplete != null)
            {
                _logger.LogTrace("Verification URI (Complete) issued for {clientId}: {verificationUriComplete}", clientId, response.VerificationUriComplete);
            }
        }
        public DeviceAuthorizationResponseGeneratorTests()
        {
            var resourceStore  = new InMemoryResourcesStore(identityResources, apiResources);
            var scopeValidator = new ScopeValidator(resourceStore, new NullLogger <ScopeValidator>());

            testResult = new DeviceAuthorizationRequestValidationResult(new ValidatedDeviceAuthorizationRequest
            {
                Client = new Client {
                    ClientId = Guid.NewGuid().ToString()
                },
                IsOpenIdRequest = true,
                ValidatedScopes = scopeValidator
            });

            generator = new DeviceAuthorizationResponseGenerator(
                options,
                new DefaultUserCodeService(new IUserCodeGenerator[] { new NumericUserCodeGenerator(), fakeUserCodeGenerator }),
                deviceFlowCodeService,
                clock,
                new NullLogger <DeviceAuthorizationResponseGenerator>());
        }
        /// <summary>
        /// Processes the response.
        /// </summary>
        /// <param name="validationResult">The validation result.</param>
        /// <param name="baseUrl">The base URL.</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">validationResult or Client</exception>
        /// <exception cref="ArgumentException">Value cannot be null or whitespace. - baseUrl</exception>
        public virtual async Task <DeviceAuthorizationResponse> ProcessAsync(DeviceAuthorizationRequestValidationResult validationResult, string baseUrl)
        {
            if (validationResult == null)
            {
                throw new ArgumentNullException(nameof(validationResult));
            }
            if (validationResult.ValidatedRequest.Client == null)
            {
                throw new ArgumentNullException(nameof(validationResult.ValidatedRequest.Client));
            }
            if (string.IsNullOrWhiteSpace(baseUrl))
            {
                throw new ArgumentException("Value cannot be null or whitespace.", nameof(baseUrl));
            }

            Logger.LogTrace("Creating response for device authorization request");

            var response = new DeviceAuthorizationResponse();

            // generate user_code
            var userCodeGenerator = await UserCodeService.GetGenerator(
                validationResult.ValidatedRequest.Client.UserCodeType ??
                Options.DeviceFlow.DefaultUserCodeType);

            var retryCount = 0;

            while (retryCount < userCodeGenerator.RetryLimit)
            {
                var userCode = await userCodeGenerator.GenerateAsync();

                var deviceCode = await DeviceFlowCodeService.FindByUserCodeAsync(userCode);

                if (deviceCode == null)
                {
                    response.UserCode = userCode;
                    break;
                }

                retryCount++;
            }

            if (response.UserCode == null)
            {
                throw new InvalidOperationException("Unable to create unique device flow user code");
            }

            // generate verification URIs
            response.VerificationUri = Options.UserInteraction.DeviceVerificationUrl;
            if (response.VerificationUri.IsLocalUrl())
            {
                // if url is relative, parse absolute URL
                response.VerificationUri = baseUrl.RemoveTrailingSlash() + Options.UserInteraction.DeviceVerificationUrl;
            }

            if (!string.IsNullOrWhiteSpace(Options.UserInteraction.DeviceVerificationUserCodeParameter))
            {
                response.VerificationUriComplete =
                    $"{response.VerificationUri}?{Options.UserInteraction.DeviceVerificationUserCodeParameter}={response.UserCode}";
            }

            // expiration
            response.DeviceCodeLifetime = validationResult.ValidatedRequest.Client.DeviceCodeLifetime;

            // interval
            response.Interval = Options.DeviceFlow.Interval;

            // store device request (device code & user code)
            response.DeviceCode = await DeviceFlowCodeService.StoreDeviceAuthorizationAsync(response.UserCode, new DeviceCode
            {
                ClientId        = validationResult.ValidatedRequest.Client.ClientId,
                IsOpenId        = validationResult.ValidatedRequest.IsOpenIdRequest,
                Lifetime        = response.DeviceCodeLifetime,
                CreationTime    = Clock.UtcNow.UtcDateTime,
                RequestedScopes = validationResult.ValidatedRequest.ValidatedResources.ScopeValues
            });

            return(response);
        }