读取UseOpenIdConnectAuthentication中的环境变量

时间:2019-05-03 07:09:16

标签: owin openid-connect katana

我当前正在开发一个应用程序,该应用程序将来自网站的流量定向到其他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)之前弄清楚如何读取环境变量?

0 个答案:

没有答案