我们使用SSO来使我们的用户满意。现在,我们只为中试人员发布了一个新应用程序,该应用程序也使用SSO。问题是其他用户是否知道URL可以登录到新应用程序(如果他们已经登录到我们的一个应用程序)。
我们如何解决只有飞行员才能登录到应用程序的问题?
答案 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地址向所有人授予访问权限,而无需更改应用程序。