【问题标题】:Confused in implementing authentication in ASP.NET MVC 5在 ASP.NET MVC 5 中实现身份验证时感到困惑
【发布时间】:2014-09-03 16:33:07
【问题描述】:

我现在真的很困惑如何在 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,如果用户未通过身份验证(如果结果是 HttpUnauthorizedResult 并且用户未通过身份验证,则我只有代码重定向到 LogIn 操作方法。考虑一下,它与逻辑 OnAuthentication 相同,所以为什么我不能只是在那时和那里重定向。我将这些代码基于网络示例)。

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

我想我的问题是:

  1. 我做的对吗?

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

  3. 如果我的操作是正确的,如何从 LogIn Action 方法设置 Principal?我该如何清除它?如果我理解正确,这是否与登录/注销(设置主体/清除主体)同义?

  4. 如果我所做的一切都是错误的,或者即使它是正确的,您能否指导我从哪里开始学习 ASP.NET MVC 的身份验证?当我搜索时,这些主题是针对某些东西的具体实现,它主要假设理解一些概念。我很难从哪里开始。

【问题讨论】:

    标签: asp.net-mvc authentication authorization


    【解决方案1】:

    您遇到的困惑很可能是由于 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 包妨碍您​​。只需将此项目用作指南,您就可以将相关代码复制并粘贴到您的应用程序中,同时进行任何必要的修改。你也不必采取一切。如果您不想要两因素身份验证,请将其留在后面。就像我说的,把它当作指南。

    【讨论】:

      【解决方案2】:

      我做的对吗?

      考虑以下代码:

      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 无关,某些示例可能没有意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-04
        • 2015-10-13
        相关资源
        最近更新 更多