2014-09-03 71 views
0

我现在对如何在ASP.NET MVC 5中实现身份验证感到非常困惑。这是我第一次使用ASP.NET MVC,我习惯于桌面应用程序。有像OWASP,OAuth,FormsAuthenticationTicket和其他我真的很难跟进的其他术语。在ASP.NET MVC中实现身份验证困惑5

我决定只是为初学者做一个简单的登录页面。只需检查数据库的用户名和密码,如果存在,则用户通过身份验证。到目前为止,根据我读过的内容,我可以这样做来实现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,如果用户没有通过验证思考它的代码,它像就像OnAuthentication逻辑一样,为什么我不能只重定向到那里,我基于这些代码在Web上的例子)。

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

我想我的问题是:

  1. 是我在做什么正确的吗?

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

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

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

回答

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认证吗?当我搜索时,主题是针对特定实现的某些主要假设理解某些概念的内容。我很难从哪里开始。

Eventhough的Help明确规定:

问题,要求我们建议还是找一本书,工具,软件库,教程等客上门资源是题外话堆栈溢出,因为它们倾向于吸引自以为是的答案和垃圾邮件。相反,请描述问题以及到目前为止解决问题所做的工作。

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

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

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包受到阻碍。只需使用此项目作为指导,您可以将相关代码复制并粘贴到您的应用程序中,同时进行必要的修改。你也不必采取一切。如果您不想使用双因素认证,请将其留下。就像我说的那样,把它当作一个指南。