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

Ale*_*lex 46 .net c# authentication asp.net-mvc-5 asp.net-identity

我正在探索SignInManager类.但MSDN上提供的信息非常无用.它只说明提供的方法和属性.

我要找的是,

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

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

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

  public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
Run Code Online (Sandbox Code Playgroud)

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

谢谢

n0r*_*0rd 66

免责声明:我对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>
Run Code Online (Sandbox Code Playgroud)

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

密码登录

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

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

外部登录

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

Asp.Net身份具有的观念UserLogin,其中User是......嗯,用户(人),并且Login是与该证书User进行身份验证.User可能有多个Logins.

从Asp.Net网站看到的OAuth流程如下所示(基于VS模板生成的默认日志流程):

  1. 您设置了您愿意接受的外部身份验证提供程序(身份验证中间件)(这可能涉及在外部网站上注册.例如,为了使用Facebook身份验证,您需要创建Facebook应用程序,在那里设置返回URL以指向您的网站,并配置FacebookAuthenticationMiddlewareFacebook为您提供的应用程序ID和应用程序秘密).
  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.如果找到,则发出Application cookie; 如果没有,它会告知您,当您收到未知信息时,您应该做您认为正确的事情Login(通常,您此时会创建新用户.此时VS模板的默认实现会询问其他信息并创建用户AccountController.ExternalLoginConfirmation).之后,用户被重定向到第4步中"保存以供日后使用"的实际返回URL.

定制存储

到目前为止,我一直没有成功为Asp.Net Identity创建自定义存储.它通常涉及实现自己的用户管理器类降UserManager<TUser, TKey>像接口和存储类实现一堆IUserStore<TUser, TKey>,IUserRoleStore<TUser, TKey>等等.

  • 非常清晰且有帮助。即使是显而易见的事情也常常需要清晰地呈现!谢谢你! (3认同)
  • 现在是 2018 年……实现自己的存储相当简单,你实现了一个 RoleStore 和一个 UserStore。如果你需要一个例子,我为 Marten 写了一个:https://github.com/yetanotherchris/Marten.AspNetIdentity/tree/master/src/Marten.AspNetIdentity (3认同)
  • `SignInManager` 是一个辅助类,用于处理外部/应用程序 cookie、密码验证和 2FA。不确定这些对 Web API 有何用处。 (2认同)