多个IdentityServer4服务的最佳实践

时间:2016-10-04 12:48:03

标签: .net core identityserver4

我有两个身份服务器和一个Web API。 我想要做的是让API与一个或两个IdentityServer进行身份验证,并且如果一个人关闭则能够切换。如果可能的话,我也希望能够在运行时添加一个新的IdentityServer。

这里有最好的做法吗?

截至目前,它看起来像这样。

        app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
        {
            Authority = $"http://localhost:5000",
            ScopeName = "my.scope",
            RequireHttpsMetadata = false,
            ScopeSecret = "secret",
        });

如果我在端口5000关闭IdentityServer,我就不能再使用API​​了。这是可以预期的。

1 个答案:

答案 0 :(得分:0)

我不确定这是否是解决问题的好方法。但这只是一种方式。 我问我的路由服务"第一个身份服务"在选项中设置Authroity。 然后我添加一个自定义的IntrospectionBackChannelHandler

        app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
        {
            Authority = $"http://{v.Address}:{v.Port}",
            IntrospectionBackChannelHandler = new CustomIntrospectionBackChannelHandler(consulService)

由于我的所有身份服务器看起来都一样但位于不同的地址,所以我真的不必费心去做管理局的事情了。

在自定义内省中....我检查每个内省并将其发送到"正确" identityserver。如果它不起作用,我会尝试另一个身份服务器。

var qs = await request.Content.ReadAsStringAsync();             var queryDic = QueryHelpers.ParseQuery(await request.Content.ReadAsStringAsync());

        var token = queryDic["token"];
        var client_id = queryDic["client_id"];
        var client_secret = queryDic["client_secret"];
        var iRequest = new IntrospectionRequest
        {
            ClientId = client_id,
            ClientSecret = client_secret,
            TokenTypeHint = "access_token",
            Token = token
        };

        IntrospectionResponse result = null;

        var svc = await _Consul.GetService(OrbitServices.IdentityServer);
        result = await TrySendAsync(iRequest, svc);
        if (!result.IsActive && result.IsError)
        {
            svc = await _Consul.GetService(OrbitServices.IdentityServer, true);
            result = await TrySendAsync(iRequest, svc);
        }

        var message = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StringContent(result.Raw, Encoding.UTF8, "application/json")
        };

        return message;