В настоящее время я работаю над приложением, которое направляет трафик с веб-сайтов различным поставщикам 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)?