在ASP.NET MVC 5中实现身份验证时感到困惑

时间:2014-09-03 16:33:07

标签: asp.net-mvc authentication authorization

我现在真的很困惑如何在ASP.NET MVC 5中实现身份验证。这是我第一次使用ASP.NET MVC而且我习惯使用桌面应用程序。有很多术语像OWASP,OAuth,FormsAuthenticationTicket和其他人一样,我真的很难跟随。

我决定只为初学者制作一个简单的登录页面。只需检查数据库的用户名和密码,如果存在,则对用户进行身份验证。到目前为止,基于我所阅读的内容,我可以实现IAuthenticationFilter。我已经像这样实现了OnAuthentication:

public void OnAuthentication(AuthenticationContext context)
{
    IIdentity ident = context.Principal.Identity;
    if (!ident.IsAuthenticated || !ident.Name == "randy") // Name is just for testing
    {
        context.Result = new HttpUnauthorizedResult();
    }
}

对于OnAuthenticationChallenge,我只有代码可以重定向到LogIn操作方法,如果用户未经过身份验证(如果结果是HttpUnauthorizedResult并且用户未经过身份验证。想一想,它就像逻辑OnAuthentication一样,为什么我不能只是重定向然后在那里。我将这些代码基于Web示例。)

在LogIn操作方法中,有一个UserRepository用于检查用户是否存在。但是如果用户存在,我不知道如何将其设置为上下文的Principal。我不知道我这样做是否正确,所以请对此发表评论。

我想我的问题是:

  1. 我的工作是否正确?

  2. 如果用户未经过身份验证,为什么Web中的示例只会在OnAuthentication中重定向。为什么要等待OnAuthentication执行?

  3. 如果我正在做的是正确的,如何从LogIn Action方法设置Principal?我该如何清除它?如果我理解正确,这是登录/退出(设置委托人/清算委托人)的同​​义词吗?

  4. 如果我所做的一切都是错的,或者即使它是对的,你能指导我到哪里可以开始学习ASP.NET MVC的身份验证吗?当我搜索时,主题是针对某些事物的特定实现,这些实现主要是假设对某些概念的理解。我很难从哪里开始。

2 个答案:

答案 0 :(得分:4)

您遇到的困惑很可能是由于ASP.NET经历过的不同身份验证系统的数量。你有ASP.NET Auth,SimpleMembership,它实际上只是ASP.NET Auth之上的一个层,现在是Identity。由于您使用的是MVC 5,因此您应该使用Identity。它是ASP.NET自上而下的身份验证重写,比以前的身份验证迭代更强大,更具扩展性。

如果您刚刚开始,最好的办法是实际开始使用Identity示例项目。在Visual Studio中,创建一个新的空MVC 5应用程序,然后在程序包管理器控制台中运行以下命令:

Install-Package Microsoft.AspNet.Identity.Samples -Pre

这将安装许多其他Nuget软件包,并为您提供相当完整的功能验证工作流程,包括外部"社交"登录提供商,电子邮件确认,密码重置,双因素身份验证等。

但是,不要在此示例项目之外构建应用程序。您将对您的应用程序的所有代码进行更改,并且您不希望样本Nuget程序包妨碍您。只需使用此项目作为指南,您就可以将相关代码复制并粘贴到您的应用程序中,同时进行任何必要的修改。你也不必采取一切措施。如果您不想要双因素身份验证,请将其置之不理。就像我说的那样,把它作为指导。

答案 1 :(得分:1)

  

我正在做的是正确的吗?

考虑以下代码:

public void OnAuthentication(AuthenticationContext context)
{
  IIdentity ident = context.Principal.Identity;
  if (!ident.IsAuthenticated || !ident.Name == "randy") // Name is just for testing
  {
      context.Result = new HttpUnauthorizedResult();
  }
}

无论基础框架如何,您都会在此具体示例中将authenticationauthorization混合。

  

如果用户未经过身份验证,为什么不在Web中的示例重定向OnAuthentication。为什么要等待OnAuthentication执行?

特别是对于ASP.Net MVC,并且无视使用的身份验证框架,应使用AuthorizeAttribute来控制对特定控制器的授权,其中有很多示例。请记住,无论您使用什么框架,角色都是开箱即用的,但最新和最好的是使用声明而不是角色(AuthorizeAttribute that uses Claims)。

  

如果我正在做的是正确的,我如何从LogIn Action方法设置Principal?我该如何清除它?如果我理解正确,这是登录/退出(设置委托人/清算委托人)的同​​义词吗?

没有详细了解complicated ASP.Net Pipeline(MVC已经为MVC开发人员很好地抽象出来,所以我们不需要在99%的时间内使用它),有事件当有人向IIS Web服务器发送请求时发生的情况。管道和安全框架主要处理有关设置当前用户身份验证和授权(在角色/声明方面)的细节。其中之一就是IPrincipal的价值。在正常和不太复杂的情况下,您不需要通过安全框架设置或删除此值(它是自动神奇地完成)(当您调用框架特定方法来记录某人进出时)。

  

如果我所做的一切都是错的,或者即使它是对的,你能指导我到哪里可以开始学习ASP.NET MVC的身份验证吗?当我搜索时,主题是针对某些事物的特定实现,这些实现主要是假设对某些概念的理解。我很难从哪里开始。

虽然Help明确指出:

  

要求我们推荐或查找图书,工具,软件库,教程其他场外资源的问题都是Stack Overflow的主题,因为它们倾向于吸引自以为是的答案和垃圾邮件相反,描述问题以及到目前为止已经做了什么来解决它。

我不相信Asp.Net Website会很快消失,因此该链接应在未来几年内有效。

最后,与许多其他技术一样,当前ASP.Net Identity (Security Framework)并不是MVC所特有的,因此如果上下文不是关于MVC的话,某些示例可能没有意义。