我们正在进行学习 Identity Server的工作,最终目的是将我们现有的身份验证服务迁移到该服务器。出于公司,物流和兼容性方面的原因,我们坚持使用IS3。我们还没有准备好过渡到Core。
我的问题有两个部分:
1)我已经修改了示例应用available here,该应用使用了自定义登录页面,以便浏览器提示用户输入X509Certificate2(作为部分登录)。用户输入密码,证书用于调用另一个返回用户特定数据的端点。此时,我们希望根据返回的数据创建自定义用户声明,然后发布Cookie。
一切正常,直到客户端收到cookie。 我似乎无法提取添加到客户端应用程序上AuthenticatedLogin
的{{1}}对象中的自定义声明。 客户端已配置为访问所有范围
似乎我缺少一些非常基本的东西。我在这里做错什么了吗?请记住,这些只是出于测试目的的毫无意义的主张。
2)这是发出索赔的可接受方法吗?由于我们的角色非常复杂,因此我们可能会使用返回的cookie来调用单独的授权服务。
我已经实现了自定义用户服务,其中Claims
重定向到了自定义登录页面:
PreAuthenticateAsync
创建声明并调用 public override Task PreAuthenticateAsync(PreAuthenticationContext context)
{
var id = ctx.Request.Query.Get("signin");
context.AuthenticateResult = new AuthenticateResult("~/custom/login?id=" + id, (IEnumerable<Claim>)null);
return Task.FromResult(0);
}
的控制器方法:
IssueLoginCookie
带有[RequireHttps]
[Route("core/custom/login")]
[HttpPost]
public ActionResult Index(string id, string password)
{
var userData = GetUser(password);
var owinEnvironment = Request.GetOwinContext().Environment;
var authenticatedLogin = new AuthenticatedLogin
{
IdentityProvider = Constants.BuiltInIdentityProvider,
Name = userData.UserName,
Subject = userData.EmailAddress,
Claims = GetClaims(userData),
PersistentLogin = false
};
owinEnvironment.IssueLoginCookie(authenticatedLogin);
var msg = owinEnvironment.GetSignInMessage(id);
var returnUrl = msg.ReturnUrl;
owinEnvironment.RemovePartialLoginCookie();
return Redirect(returnUrl);
}
// add our CUSTOM claims
private List<Claim> GetClaims(CustomUser authenticatedUser)
{
List<Claim> claims = new List<Claim>();
claims.Add(new Claim("claim1", authenticatedUser.CustomClaim1));
claims.Add(new Claim("claim2", authenticatedUser.CustomClaim2));
claims.Add(new Claim("claim3", authenticatedUser.CustomClaim3));
claims.Add(new Claim("Claim4", authenticatedUser.CustomClaim4));
return claims;
}
装饰器的客户端控制器方法:
Authorize
已注册的内存范围:
[Authorize]
public ActionResult About()
{
// "CustomClaim1", "CustomClaim2" etc are not there :(
return View((User as ClaimsPrincipal).Claims);
}
最后是客户的var scope1 = new Scope
{
Enabled = true,
Name = "user",
Type = ScopeType.Identity,
Claims = new List<ScopeClaim>
{
new ScopeClaim("CustomClaim1", true),
new ScopeClaim("CustomClaim2", true),
new ScopeClaim("CustomClaim3", true),
new ScopeClaim("CustomClaim4", true),
},
IncludeAllClaimsForUser = true
};
:
Configuration
答案 0 :(得分:0)
您好,尝试在客户端中添加范围
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Authority = "https://localhost/idprov/core",
ClientId = "mvc",
RedirectUri = "https://localhost/dummyclient/About",
ResponseType = "id_token",
ClientSecret = "secret",
Scope = "openid partyuser CustomClaim1 CustomClaim2",
SignInAsAuthenticationType = "Cookies",
});