SignInManager,它是什么以及如何使用,何时使用

本文关键字:何使用 何时使 它是什么 SignInManager | 更新日期: 2023-09-27 17:57:39

我正在探索SignInManager类。但是MSDN上提供的信息是非常无用的。它只是告诉提供了哪些方法和属性。

我要找的是

  1. 什么是SignInManager
  2. 如何使用它
  3. 我有自己的数据库,其中包含与凭据相关的信息(用户名和密码)

我如何使用SignInmanager,以及如何使用它,以便我的自定义数据库用于验证用户?

我使用的是asp.net MVC 5和Visual Studio 2015。在我的示例项目中,我有一个包含等操作方法的帐户控制器

  public async Task<ActionResult> ExternalLoginCallback(string returnUrl)

但我不知道如何使用它,MSDN提供这方面的信息是完全无用的。任何有用的链接都可以详细解释它,因为我不知道SignInManager是什么以及它的用途。

感谢

SignInManager,它是什么以及如何使用,何时使用

免责声明:我对ASP.NET身份中使用的模型感到困惑,我所说的是我对事情的理解,这可能是不准确的(我可能也在陈述明显的事情,所以我道歉)。此外,我最近在玩Asp.Net Core的身份,这与Asp.Net 4的身份略有不同,所以我可能会把事情搞混。

Cookie

ASP.NET标识使用两种cookie操作:应用程序cookie和外部cookie。应用程序cookie包含您的应用程序的标识,由登录管理员颁发。外部cookie包含外部身份验证提供者身份,由身份验证中间件(例如FacebookAuthenticationMiddleware)发布。您使用登录管理器来使用外部cookie,而不是发布应用程序cookie。如果你不使用外部身份验证,你就不会处理外部cookie。

登录管理员

类声明如下:

public class SignInManager<TUser, TKey> : IDisposable 
    where TUser : class, IUser<TKey> 
    where TKey : IEquatable<TKey>

因此,只要实现了IUser<TKey>接口,就可以使用任何类作为用户。或者,如果从零开始,则使用IdentityUser作为基础,实现IUser<string>。在过去,我曾尝试创建一个使用int作为TKey的实现,但在花了相当长的时间尝试使其工作但没有看到任何进展后,我放弃了这一尝试。

密码登录

SignInManager.SignInAsync方法在没有任何检查的情况下立即为指定用户发布应用程序cookie,所以如果您实现任何自定义身份验证逻辑,您可能需要使用它(默认的asp.net MVC模板在注册用户后使用它,这样他们就不必在注册后立即进行身份验证)。

给定用户名和密码的SignInManager.PasswordSignInAsync会检查其有效性,并在正确的情况下发出应用程序cookie。

外部登录

您可能希望用户使用某些外部网站进行身份验证,并使用OAuth将身份验证信息传递给您,而不是让用户专门为您的网站创建登录名和密码。

Asp.Net Identity有UserLogin的概念,其中User是……嗯,用户(个人),LoginUser进行身份验证的凭证。User可能具有多个Logins。

从Asp.Net网站上看到的OAuth流如下(基于VS模板生成的默认登录流):

  1. 你设置了你愿意接受的外部身份验证提供商(身份验证中间件)(这可能涉及在外部网站上注册。例如,为了使用Facebook身份验证,你需要创建Facebook应用程序,在那里设置返回URL以指向你的网站,并用Facebook为你提供的应用程序ID和应用程序机密配置FacebookAuthenticationMiddleware
  2. 您向未经身份验证的用户提供了您支持的外部提供商的选择
  3. 用户选择一个提供商,选择将发送到您的Asp.Net web应用程序
  4. Web应用程序发出一个包含要使用的提供者名称的ChallengeResult(这通常发生在AccountController.ExternalLogin中),返回URL被设置为调用AccountController.ExternalLoginCallback,用户最终应该返回的实际返回URL被保存以备将来使用
  5. 适当的中间件捕获ChallengeResult对象,并将其转换为HTTP重定向响应,从而使用户的浏览器转到要求用户提供凭据的第三方网站
  6. 第三部分网站在成功验证后将用户重定向回您的网站,并将其重定向到由验证中间件创建的特定URL(对于Facebook,它是/signin-facebookIIRC)
  7. 身份验证中间件会截获此调用,验证第三方网站传递的数据,如果一切正常,会发出外部cookie,并将您重定向到步骤4中设置为返回URL的任何位置(应为AccountController.ExternalLoginCallback
  8. AccountController.ExternalLoginCallback中,您应该使用外部cookie,而不是发布应用程序cookie。这就是SignInManager.ExternalSignInAsync所做的:给定登录信息,它试图找到具有该Login的用户。如果发现,则发出应用程序cookie;如果没有,它会通知你,当你收到未知的Login时,你应该做你认为正确的事情(通常,你会在这一点上创建新的用户。VS模板中的默认实现会在这个点上要求额外的信息,并在AccountController.ExternalLoginConfirmation中创建用户)。在步骤4中,用户被重定向到"保存以备以后使用"的实际返回URL

自定义存储

到目前为止,我还没有成功为Asp.Net Identity创建自定义存储。它通常包括实现自己的用户管理器类(从UserManager<TUser, TKey>开始)和存储类(实现IUserStore<TUser, TKey>IUserRoleStore<TUser, TKey>等一系列接口)。