我们使用SSO为我们的用户的autentication。现在,我们已经发布了仅在试验测试员到使用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
属性的所有代码,将仍然可以为大家!
如果你想阻止访问这些方法,那么你就需要检查代码,e.g用户:
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的,轮廓和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地址的每一个人,而无需更改应用程序。