C# · 12月 29, 2021

c# – SignInManager,它是什么,如何,何时使用?

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

我正在寻找的是,

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

如何使用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相比有所不同,所以我可以混合起来.

饼干

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&TK.接口.或者使用IdentityUser作为您的基础,如果从头开始,实现IUser< string>.在过去,我试图创建一个使用int作为TKey的实现,但在花费相当长的一段时间尝试使其工作,而没有看到任何进展之后放弃尝试.

密码登录

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

SignInManager.PasswordSignInAsync给出用户名和密码检查其有效性并发布应用程序cookie,如果它们是正确的.

外部登录

而不是让用户专门为您的网站创建登录名和密码,您可能希望他们使用一些外部网站来验证身份验证信息,并通过OAuth将认证信息传递给您.

Asp.Net身份有用户和登录的概念,用户是…用户(一个人)和登录是用户认证的凭据.用户可能有多个登录.

从Asp.Net网站看到的OAuth流程看起来像这样(根据VS模板生成的流默认日志):

>您设置了您愿意接受的外部认证提供程序(认证中间件)(可能涉及在外部网站上注册),例如,为了使用Facebook身份验证,您需要创建Facebook应用程序,设置返回URL到您的网站,并配置FacebookAuthenticationMiddleware与应用程序ID和应用程序秘密Facebook提供给您).
>您提供未经身份验证的用户可选择您支持的外部提供商.
>用户选择提供商,选择将发送到您的Asp.Net Web应用程序
> Web应用程序发出一个包含要使用的提供程序名称的ChallengeResult(通常发生在AccountController.ExternalLogin中),返回URL设置为调用AccountController.ExternalLoginCallback,实际返回URL用户应该保存以备以后使用.
>适当的中间件捕获ChallengeResult对象并将其转换为HTTP重定向响应,导致用户的浏览器进入第三方网站,要求用户获取凭据.
>成功验证后第三方网站将用户重新定向到您的网站,由认证中间件制作的特定网址(对于Facebook / signin-facebook IIRC).
>认证中间件拦截此调用,验证第三方网站传递的数据,如果一切正常都会发送外部Cookie,并重定向到第4步(应为AccountController.ExternalLoginCallback)的任何设置为返回URL的设置.
>在AccountController.ExternalLoginCallback中,您应该使用外部Cookie并发出应用程序cookie.这就是SignInManager.ExternalSignInAsync的作用:给出登录信息,它尝试用该登录找到用户.如果发现,它发出应用程序cookie;如果没有,它通知你,你应该做你认为是正确的,当你收到未知的登录(通常,你创建新的用户在这一点上.VS模板的默认实现要求在这一点上的附加信息,并创建用户在AccountController .ExternalLoginConfirmation).之后,该用户被重定向到实际的返回URL“保存为以后”在步骤4.

自定义存储

迄今为止,我一直未成功创建Asp.Net Identity的自定义存储.它通常涉及实现您自己的用户管理器类降级UserManager< TUser,TKey>以及实现一系列接口的存储类,如IUserStore< TUser,TKey>,IUserRoleStore&TUser,TKey>等.