在PROD中暂时为用户隐藏新发布的应用程序

时间:2019-02-07 14:37:59

标签: authentication login single-sign-on reverse-proxy identityserver4

我们使用SSO来使我们的用户满意。现在,我们只为中试人员发布了一个新应用程序,该应用程序也使用SSO。问题是其他用户是否知道URL可以登录到新应用程序(如果他们已经登录到我们的一个应用程序)。

我们如何解决只有飞行员才能登录到应用程序的问题?

1 个答案:

答案 0 :(得分:1)

当无效或未知用户想要访问应用程序时,您应该做的是使管道短路。您可以使用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表中添加一条记录(或通过ApiScope对其进行缩小):

ApiClaims-http://mynewapp.com/pilot-tester(链接到ApiResource Api1)。

用户资源保持不变,但是IdentityServer现在也将声明添加到访问令牌中。 以与上述相同的方式在api中注册策略。


暂时使用过滤器是有条件的,您可以选择启用/禁用过滤器。

但是您可能根本不必编写代码。在代理后面意味着您可以先查看那里的过滤器选项。您可能要过滤IP地址。这意味着您可以从某些IP地址向所有人授予访问权限,而无需更改应用程序。