我正在探索SignInManager类。但MSDN上提供的信息非常无用。它只说明提供的方法和属性。
我在寻找的是,
1)什么是SignInManager? 2)如何使用它? 3)我有自己的数据库,其中包含凭据相关信息(用户名和密码)
如何使用SignInmanager以及如何使用它以便我的自定义数据库用于验证用户?
我正在使用asp.net MVC 5和Visual Studio 2015.在我的示例项目中,我有一个包含操作方法的帐户控制器,如
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
但我不知道如何使用它,MSDN完全无用于提供相关信息。任何有用的链接都会详细解释它,因为我不知道SignInManager是什么以及它是什么。
由于
答案 0 :(得分:61)
免责声明:我对ASP.NET身份中使用的模型感到困惑,我说的是我对事物的理解,这可能是不准确的(我可能也会说明显事情,所以我道歉)。此外,我最近玩的是Asp.Net Core的身份,与Asp.Net 4相比略有不同,所以我可能会混淆。
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
。
从Asp.Net网站看到的OAuth流程如下所示(基于VS模板生成的默认日志流程):
FacebookAuthenticationMiddleware
。ChallengeResult
,其中包含要使用的提供程序的名称(这通常发生在AccountController.ExternalLogin
中),返回URL设置为调用AccountController.ExternalLoginCallback
,实际返回URL用户应该最终保存以供日后使用。ChallengeResult
对象并将其转换为HTTP重定向响应,导致用户的浏览器转到第三方网站,要求用户提供凭据。/signin-facebook
IIRC)。AccountController.ExternalLoginCallback
)。AccountController.ExternalLoginCallback
中,您需要使用外部Cookie并发出应用程序Cookie。这就是SignInManager.ExternalSignInAsync
的作用:给定登录信息,它会尝试查找具有该Login
的用户。如果找到,则发出Application cookie;如果没有,它会告知您,当您收到未知Login
时,您应该按照您认为正确的方式进行操作(通常,此时您会创建新用户。此时VS模板的默认实现会询问其他信息,以及在AccountController.ExternalLoginConfirmation
中创建用户。之后,用户被重定向到第4步“保存以供日后使用”的实际返回网址。到目前为止,我一直未能成功为Asp.Net Identity创建自定义存储。它通常涉及实现您自己的用户管理器类降序UserManager<TUser, TKey>
和存储类,实现一堆接口,如IUserStore<TUser, TKey>
,IUserRoleStore<TUser, TKey>
等。