Чтение переменной среды в UseOpenIdConnectAuthentication - PullRequest
0 голосов
/ 03 мая 2019

В настоящее время я работаю над приложением, которое направляет трафик с веб-сайтов различным поставщикам OpenId Connect. Конечная точка, которая направляет трафик, получит запрос с siteId в строке запроса. Идентификатор сайта используется для поиска поставщика OpenID Connect, на который должен быть направлен данный веб-сайт.

Я пытаюсь выяснить, как настроить конвейер OWIN.

Что я хочу сделать, это:
1) Получить идентификатор сайта из строки запроса
2) Вызвать класс фабрики с siteId, чтобы получить объект конфигурации с деталями конфигурации
3) Создайте объект OpenIdConnectAuthenticationOptions
4) Вызовите app.UseOpenIdConnectAuthentication (myOptionsObject)

Я создал небольшой класс промежуточного программного обеспечения, который считывает значение из строки запроса и сохраняет его в словаре среды:

    public class IdentityServerConfigurationMiddleware
    {
        private AppFunc _next;

        public IdentityServerConfigurationMiddleware(AppFunc next)
        {
            _next = next;
        }

        public async Task Invoke(IDictionary<string, object> environment)
        {
            var ctx = new OwinRequest(environment);
            var queryStringParser = new QueryStringParser(ctx.Context.Request.QueryString.Value);
            var siteId = queryStringParser.GetSiteId();
            environment.Add("siteId", siteId);
            var function = queryStringParser.GetFunction();
            environment.Add("function", function);
            await _next(environment);
        }
    }

    public class QueryStringParser
    {
        private readonly string _querystring;
        private readonly NameValueCollection _queryStringValues;

        public QueryStringParser(string queryString)
        {
            _querystring = queryString;
            _queryStringValues = HttpUtility.ParseQueryString(_querystring);
        }

        public virtual int GetSiteId()
        {
            var siteIdStr = _queryStringValues["siteId"];
            if (int.TryParse(siteIdStr, out var siteId)) return siteId;
            throw new ArgumentException("No site id provided");
        }

        public virtual string GetFunction()
        {
            var function = _queryStringValues["function"];
            if (!string.IsNullOrEmpty(function))
                switch (function)
                {
                    case ActionTypes.Logon:
                    case ActionTypes.Signup:
                        return function;
                    default:
                        throw new ArgumentException("Unknown function provided");
                }
            throw new ArgumentException("No function provided");
        }
    }

    public static class ActionTypes
    {
        public const string Logon = "logon";
        public const string Signup = "signup";
    }

Я проверил, что значения правильно считываются и добавляются в среду, добавив еще одно простое промежуточное ПО OWIN в конвейер после промежуточного ПО IdentityServerConfigurationMiddleware.

Но я не могу понять, как читать переменные окружения, прежде чем сделать вызов asp.UseOpenIdConnectAuthentication (myOptions)?

...