Я предполагаю, что вы пытаетесь реализовать двухэтапную аутентификацию для some of your resource
.
. Для этого вам нужно использовать несколько authentication scheme
и Authorize policies
, но это сложно, потому что аутентификация Windows не контролируется.нам нужно использовать некоторую хитрость, чтобы узнать, что это ваш второй логин.
аутентификация
- Схема аутентификации по умолчанию:
Windows
, это базовая схема для аутентификации пользователя Windows. - Вторая
Cookies
базовая схема аутентификации: SuperUserTwoStep
.нам нужно это, чтобы перейти к нашей пользовательской логике входа в систему.
Авторизовать
-
Authorize policies
для указанной схемы. - страницу входа для входа в систему *Схема 1024 *.
//startup
services.AddAuthentication(HttpSysDefaults.AuthenticationScheme)
.AddCookie("SuperUserTwoStep",op=>op.LoginPath = "/account/superuser2steplogin");
services.AddAuthorization(op =>
{
op.AddPolicy("SuperUser", b => b.AddAuthenticationSchemes("SuperUserTwoStep")
.RequireAuthenticatedUser()
.RequireClaim(ClaimTypes.Role, "SuperUser"));
});
// login
public static IDictionary<string, string> States { get; set; } = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
[Route("/account/superuser2steplogin")]
public async Task<IActionResult> LoginTwoStepConfirm(string returnUrl, [FromServices]IAuthorizationService authorizationService,
[FromServices]IAuthorizationPolicyProvider policyProvider)
{
var winresult = await HttpContext.AuthenticateAsync(IISDefaults.AuthenticationScheme);
if (winresult.Succeeded)
{
if (States.TryGetValue(winresult.Principal.Identity.Name, out _))
{
States.Remove(winresult.Principal.Identity.Name);
var principal = new System.Security.Claims.ClaimsPrincipal(new System.Security.Claims.ClaimsIdentity(winresult.Principal.Claims,"twostepcookie"));
await HttpContext.SignInAsync("SuperUserTwoStep", principal);
return Redirect(returnUrl);
}
else
{
States[winresult.Principal.Identity.Name] = "1";
return Challenge(IISDefaults.AuthenticationScheme);
}
}
else
{
return Challenge(IISDefaults.AuthenticationScheme);
}
}
[Authorize("SuperUser")]
public IActionResult YourSecurePage()
{
return Content("hello world");
}
Самое сложное - отследить, что это второй раз для входа в систему, я пытаюсь использовать cookie, но он не работаетпоэтому я пишу static IDitionary<string,string>
для отслеживания 10 возможно, лучше использовать распределенный кеш