我正在努力更好地处理 ASP.NET Core 身份验证。
我定义了一个简单的用户名/密码身份验证处理程序,它负责在
HandleAuthentication
中重建用户身份,以及在登录页面上完成登录后登录用户(创建 cookie)。
登录页面在进行用户名密码验证后,将构建如下所示的声明主体:
HttpContext.SignInAsync("MyAuthScheme", principal);
上面的行将调用我的身份验证处理程序的
Signin
方法,该方法保留带有来自主体对象的信息的基本 cookie。
在登录页面上,用户有一个复选框选项,用户还可以验证一些关键短语(如 2fa)。
如果选中该复选框,经过身份验证的用户将导航到其他身份验证屏幕,他们将在其中输入他们知道的一些关键短语。
问题:
一旦确认了关键短语,是否应该将其添加为现有用户主体的声明,还是添加新的身份?什么是正确的做法?我认为这应该是一个索赔?
我们需要记录用户已进一步验证的新事实(关键短语),因此我再次调用
HttpContext.SignIn
方法,该方法会从第一次登录时重建带有附加声明的cookie。
它似乎有效,但我很困惑是否应该为用户名、密码和关键短语使用单个身份验证处理程序或各 1 个处理程序?
如果我两个实现两个不同的身份,他们是否应该存储在两个不同的cookie中?
一旦确认了关键短语,是否应该将其添加为对现有用户主体的声明,还是添加新的身份?什么是正确的做法?我认为这应该是一个索赔?
在我看来,您应该首先决定要在应用程序中使用哪些声明。
例如,如果在您的应用程序内部您需要知道用户如何登录、关键短语或用户名密码,那么您可以在用户内部添加声明。并且无需为关键词和用户名密码添加多个身份。
我们需要记录用户已进一步验证的新事实(关键短语),因此我再次调用 HttpContext.SignIn 方法,该方法使用附加声明从第一次登录重建 cookie。
这有点混乱,通常,外部登录(两个因素)和用户名密码登录是不同的方法都允许用户登录。
我不明白你的意思是允许用户登录两次。您可以在正常登录方法中编写逻辑,该方法将检查该复选框,如果单击单击框,则重定向到外部登录页面。
在外部登录页面内,您可以编写声明并使用 httpcontext.signin 将声明写入 cookie。它不会调用此登录两次。