Мы находимся в процессе обучения Identity Server с возможной целью перенести на него существующую службу аутентификации.По причинам компании, логистики и совместимости мы придерживаемся IS 3. Мы не совсем готовы перейти на Core.
На мой вопрос есть две части:
1) Iизменили образец приложения , доступного здесь , который использует пользовательскую страницу входа в систему, чтобы браузер запрашивал у пользователя X509Certificate2 (в качестве частичного входа).Пользователь вводит пароль, а сертификат используется для вызова другой конечной точки, которая возвращает пользовательские данные.На этом этапе мы хотим создать пользовательских требований пользователя на основе возвращенных данных, а затем выдать cookie.
Все это работает нормально, пока клиент не получит cookie. Я не могу извлечь пользовательские утверждения, добавленные к AuthenticatedLogin
* Claims
объекту в клиентском приложении. Клиент настроен для доступа ко всем областям.
Кажется, мне не хватает чего-то очень простого.Я что-то здесь не так делаю?Имейте в виду, это просто бессмысленные претензии для целей тестирования.
2) Будет ли это приемлемым подходом для подачи претензий?Затем мы, вероятно, будем использовать возвращенный файл cookie для вызова отдельной службы авторизации, поскольку наши роли довольно сложны.
Я реализовал пользовательскую службу пользователя с 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
:
public void Configuration(IAppBuilder app)
{
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
AntiForgeryConfig.UniqueClaimTypeIdentifier = Constants.ClaimTypes.Subject;
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap = new Dictionary<string, string>();
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies"
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Authority = "https://localhost/idprov/core",
ClientId = "mvc",
RedirectUri = "https://localhost/dummyclient/About",
ResponseType = "id_token",
ClientSecret = "secret",
Scope = "openid partyuser",
SignInAsAuthenticationType = "Cookies",
});
}
клиента