我当前正在开发一个应用程序,该应用程序将来自网站的流量定向到其他OpenId Connect提供程序。引导流量的端点将收到一个在查询字符串中带有siteId的请求。 siteId用于查找相关网站应定向到的OpenID Connect提供程序。
我正在努力弄清楚如何配置OWIN管道。
我想做的是这样的:
1)从querystring中获取siteId
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";
}
通过在IdentityServerConfigurationMiddleware中间件软件之后向管道添加另一个简单的OWIN中间件,我已经验证了这些值已正确读取并添加到环境中。
但是我无法在调用asp.UseOpenIdConnectAuthentication(myOptions)之前弄清楚如何读取环境变量?