在 PROD 中为用户暂时隐藏新发布的应用
Hide newly released application temporarly for users in PROD
我们使用 SSO 来验证我们的用户。现在我们已经发布了一个仅供试点测试人员使用的新应用程序到我们的生产环境,它也使用 SSO。问题是如果其他用户知道 URL 可以登录到新应用程序,如果他们已经登录到我们的应用程序之一。
我们如何解决只有试点测试人员才能登录应用程序的问题?
您应该做的是在无效或未知用户想要访问应用程序时将管道短路。您可以使用 middleware 或向授权组件添加过滤器来完成此操作。
最简单的方法可能是使用 Claim-based authorization。您只需添加一个政策来查找是否存在索赔。
客户端的启动看起来像这样:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
// this sets up a default authorization policy for the application
// in this case, authenticated users are required
// (besides controllers/actions that have [AllowAnonymous])
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.RequireClaim("http://mynewapp.com/pilot-tester")
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.GetClaimsFromUserInfoEndpoint = true;
options.ClaimActions.MapAll();
options.Scope.Add("mynewapp");
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ClientId = "mvc";
options.ClientSecret = "secret";
options.ResponseType = "code id_token";
});
}
这只会授予试点测试人员访问权限。请注意,所有使用 AllowAnonymous
属性的代码仍然可供所有人使用!
如果您想阻止访问这些方法,那么您需要使用代码检查用户,例如:
if (User.Identity.IsAuthenticated &&
!User.HasClaim(c => c.Type == "http://mynewapp.com/pilot-tester"))
return Redirect("...");
如何配置IdentityServer:
如果您的应用只有一个网站而没有其他 api,那么您需要将声明添加到标识中。
在数据库中确保添加了以下记录(值是示例):
AspNetUserClaims - 为每个试点测试用户添加声明。类型应该是您可以用于过滤器的类型,例如 http://mynewapp.com/pilot-tester
和值 true
.
IdentityResources - mynewapp
。对应于请求的范围。
IdentityClaims - http://mynewapp.com/pilot-tester
(链接到 IdentityResource mynewapp
)。
这是如何工作的:
用户是具有声明的资源。为了保持令牌小,声明被请求范围内的声明过滤:openid、profile 和 mynewapp。
所有按类型匹配的声明都包含在 User.Identity.Claims 集合中,该集合在测试策略时使用。
如果您使用的是 API,那么您也应该保护该资源。向 ApiResources Api1
添加一条记录。客户端应用程序应请求范围:
options.Scope.Add("api1");
请注意,在这种情况下,ApiResource 和 ApiScope 具有相同的名称。但是 ApiResource 和 ApiScope 之间的关系是 1:n.
向 ApiClaims 添加记录 table(或 ApiScope 以缩小范围):
ApiClaims - http://mynewapp.com/pilot-tester
(链接到 ApiResource Api1
)。
用户资源保持不变,但现在 IdentityServer 也会将声明添加到访问令牌。 在api中按照上述方法注册策略。
作为临时过滤器,您可能希望使过滤器有条件,让您可以选择启用/禁用过滤器。
但您可能根本不需要编写代码。在代理后面意味着您可以先查看那里的过滤器选项。您可能想要过滤 ip 地址。这意味着您可以从特定 IP 地址向所有人授予访问权限,而无需更改应用程序。
我们使用 SSO 来验证我们的用户。现在我们已经发布了一个仅供试点测试人员使用的新应用程序到我们的生产环境,它也使用 SSO。问题是如果其他用户知道 URL 可以登录到新应用程序,如果他们已经登录到我们的应用程序之一。
我们如何解决只有试点测试人员才能登录应用程序的问题?
您应该做的是在无效或未知用户想要访问应用程序时将管道短路。您可以使用 middleware 或向授权组件添加过滤器来完成此操作。
最简单的方法可能是使用 Claim-based authorization。您只需添加一个政策来查找是否存在索赔。
客户端的启动看起来像这样:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
// this sets up a default authorization policy for the application
// in this case, authenticated users are required
// (besides controllers/actions that have [AllowAnonymous])
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.RequireClaim("http://mynewapp.com/pilot-tester")
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.GetClaimsFromUserInfoEndpoint = true;
options.ClaimActions.MapAll();
options.Scope.Add("mynewapp");
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ClientId = "mvc";
options.ClientSecret = "secret";
options.ResponseType = "code id_token";
});
}
这只会授予试点测试人员访问权限。请注意,所有使用 AllowAnonymous
属性的代码仍然可供所有人使用!
如果您想阻止访问这些方法,那么您需要使用代码检查用户,例如:
if (User.Identity.IsAuthenticated &&
!User.HasClaim(c => c.Type == "http://mynewapp.com/pilot-tester"))
return Redirect("...");
如何配置IdentityServer:
如果您的应用只有一个网站而没有其他 api,那么您需要将声明添加到标识中。
在数据库中确保添加了以下记录(值是示例):
AspNetUserClaims - 为每个试点测试用户添加声明。类型应该是您可以用于过滤器的类型,例如 http://mynewapp.com/pilot-tester
和值 true
.
IdentityResources - mynewapp
。对应于请求的范围。
IdentityClaims - http://mynewapp.com/pilot-tester
(链接到 IdentityResource mynewapp
)。
这是如何工作的:
用户是具有声明的资源。为了保持令牌小,声明被请求范围内的声明过滤:openid、profile 和 mynewapp。
所有按类型匹配的声明都包含在 User.Identity.Claims 集合中,该集合在测试策略时使用。
如果您使用的是 API,那么您也应该保护该资源。向 ApiResources Api1
添加一条记录。客户端应用程序应请求范围:
options.Scope.Add("api1");
请注意,在这种情况下,ApiResource 和 ApiScope 具有相同的名称。但是 ApiResource 和 ApiScope 之间的关系是 1:n.
向 ApiClaims 添加记录 table(或 ApiScope 以缩小范围):
ApiClaims - http://mynewapp.com/pilot-tester
(链接到 ApiResource Api1
)。
用户资源保持不变,但现在 IdentityServer 也会将声明添加到访问令牌。 在api中按照上述方法注册策略。
作为临时过滤器,您可能希望使过滤器有条件,让您可以选择启用/禁用过滤器。
但您可能根本不需要编写代码。在代理后面意味着您可以先查看那里的过滤器选项。您可能想要过滤 ip 地址。这意味着您可以从特定 IP 地址向所有人授予访问权限,而无需更改应用程序。