我正在探索SignInManager类。但是MSDN上提供的信息是非常无用的。它只是告诉提供了哪些方法和属性。
我要找的是
- 什么是SignInManager
- 如何使用它
- 我有自己的数据库,其中包含与凭据相关的信息(用户名和密码)
我如何使用SignInmanager,以及如何使用它,以便我的自定义数据库用于验证用户?
我使用的是asp.net MVC 5和Visual Studio 2015。在我的示例项目中,我有一个包含等操作方法的帐户控制器
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
但我不知道如何使用它,MSDN提供这方面的信息是完全无用的。任何有用的链接都可以详细解释它,因为我不知道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有User
和Login
的概念,其中User
是……嗯,用户(个人),Login
是User
进行身份验证的凭证。User
可能具有多个Login
s。
从Asp.Net网站上看到的OAuth流如下(基于VS模板生成的默认登录流):
- 你设置了你愿意接受的外部身份验证提供商(身份验证中间件)(这可能涉及在外部网站上注册。例如,为了使用Facebook身份验证,你需要创建Facebook应用程序,在那里设置返回URL以指向你的网站,并用Facebook为你提供的应用程序ID和应用程序机密配置
FacebookAuthenticationMiddleware
) - 您向未经身份验证的用户提供了您支持的外部提供商的选择
- 用户选择一个提供商,选择将发送到您的Asp.Net web应用程序
- Web应用程序发出一个包含要使用的提供者名称的
ChallengeResult
(这通常发生在AccountController.ExternalLogin
中),返回URL被设置为调用AccountController.ExternalLoginCallback
,用户最终应该返回的实际返回URL被保存以备将来使用 - 适当的中间件捕获
ChallengeResult
对象,并将其转换为HTTP重定向响应,从而使用户的浏览器转到要求用户提供凭据的第三方网站 - 第三部分网站在成功验证后将用户重定向回您的网站,并将其重定向到由验证中间件创建的特定URL(对于Facebook,它是
/signin-facebook
IIRC) - 身份验证中间件会截获此调用,验证第三方网站传递的数据,如果一切正常,会发出外部cookie,并将您重定向到步骤4中设置为返回URL的任何位置(应为
AccountController.ExternalLoginCallback
) - 在
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>
等一系列接口)。