SignInManager,它是啥以及如何使用,何时使用?
Posted
技术标签:
【中文标题】SignInManager,它是啥以及如何使用,何时使用?【英文标题】:SignInManager,what it is and how,when to use?SignInManager,它是什么以及如何使用,何时使用? 【发布时间】:2016-11-21 22:35:51 【问题描述】:我正在探索 SignInManager 类。但是MSDN上给出的信息是很没用的。它只说明提供了哪些方法和属性。
我正在寻找的是,
-
什么是 SignInManager?
如何使用?
我有自己的数据库,其中包含与凭据相关的信息(用户名和密码)
如何使用 SignInmanager 以及如何使用它,以便使用我的自定义数据库对用户进行身份验证?
我正在使用 asp.net MVC 5 和 Visual Studio 2015。在我的示例项目中,我有帐户控制器,其中包含类似的操作方法
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
但我不知道如何使用它,MSDN 完全没有提供这方面的信息。任何有用的链接都可以详细解释它,因为我不知道 SignInManager 是什么以及它的用途。
谢谢
【问题讨论】:
【参考方案1】:免责声明:我自己对 ASP.NET 身份中使用的模型感到困惑,我所说的是我对事物的理解,这可能是不准确的(我也可能在陈述明显的事情,所以我道歉)。另外,我最近在玩 Asp.Net Core 的身份,这与 Asp.Net 4 的身份略有不同,所以我可能会混淆。
Cookies
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>
等。
【讨论】:
很好的答案。关于外部登录的第8步,我是否也应该在web api中使用signinmanager?SignInManager
是一个帮助类,用于处理外部/应用程序 cookie、密码验证和 2FA。不确定这些对 Web API 有什么用处。
非常清晰和有帮助。即使是显而易见的也经常需要清楚地呈现!谢谢!
优秀的答案
现在是 2018 年......实现自己的存储非常简单,您实现了 RoleStore 和 UserStore。如果您需要示例,我为 Marten 写了一篇:github.com/yetanotherchris/Marten.AspNetIdentity/tree/master/…以上是关于SignInManager,它是啥以及如何使用,何时使用?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 应用程序密钥 - 它是啥以及它是如何工作的?