2012-03-28 69 views
2

我已经创建了空白的Asp.Net-MVC 3 Web应用程序,并且想要编写我自己的非常简单的认证。创建一个数据库,其中存储有关用户的所有信息。创建一个控制器,用文本框查看登录名和密码。 因此,现在用户打开我的网站,输入他的登录名和密码,这些信息在服务器上接收并处理(通过我自己的ValidateUser方法)。我应该在哪里存储关于此用户的信息以供进一步使用?是否可以在没有标准类和名称空间的情况下创建自己的认证?

如果你不明白我想要什么,那么问题是:我可以实现我自己的身份验证过程,而不使用标准MembershipRoles和MembershipProviders?

+0

一定要整合与FormsAuthentication位自定义解决方案。如果你真的想把血弄在手上,看看[Phil Haack的帖子](http://haacked.com/archive/2011/10/04/prevent-forms-authentication-login-page-redirect-when-you -donrsquot-want.aspx) – 2012-03-28 12:59:08

+0

会写一个自定义会员供应商解决您的问题?谷歌“实现成员资格提供” http://aspguy.wordpress.com/2011/07/30/single-sign-on-with-wcf-and-asp-net-custom-membership-provider/ – RickAndMSFT 2012-03-28 17:17:42

回答

1

您可以编写自己的自定义MemberShipProvider并调用您自己的ValidateUser方法。

入住这Implementing a Membership Provider

如果你这样做的方式,那么你可以使用的优点像

  1. 重定向如果不是在配置文件中设置该
  2. 认证登录页面登录后在你可以使用返回url重定向回到用户所在的页面。
+0

你甚至不需要这样做。您可以编写一些更加自定义的内容,并且只要您验证用户就发布一张票。成员/角色提供者在依赖注入方面效果不佳。 – Dismissile 2012-03-28 13:39:21

+1

好的建议。在我看来,使用成员资格/角色提供者的最大好处是它们已经被嵌入并且有充分的文档记录。如果您将工作建立在已完成多个版本的组件和文档上,则不太可能出现严重的安全性错误。即使您对安全知识/技能非常有信心,从头开始自己的安全性也是危险的业务。 – ajk 2012-03-28 15:47:30

+0

@Dismissile将安全风险留给dotnet框架是比较好的,而不是由我们自己处理。你是对的我也有使用DI与Spring.Net的问题http://stackoverflow.com/questions/5991253/using-configurableactivedirectorymembershipprovider-in-spring-net但妥协与会员提供商的其他好处。 – Kiru 2012-03-28 17:58:34

1

在控制器动作到您发布的登录表单,你可以验证凭据对你的数据库,如果成功发出authntication cookie,将包含当前连接的用户的用户名,这样就可以在以后的行动检索。

例如假设你有一个包含其发布到登录方法的用户名和密码字段的表单:

[HttpPost] 
public ActionResult LogOn(string username, string password) 
{ 
    // TODO: up to you to implement the VerifyCredentials method 
    if (!VerifyCredentials(username, password)) 
    { 
     // wrong username or password: 
     ModelState.AddModelError("", "wrong username or password"); 
     return View(); 
    } 

    // username and password match => emit an authentication cookie: 
    FormsAuthentication.SetAuthCookie(username, false); 

    // and redirect to some controller action which is protected by the 
    // [Authorize] attribute and which should be accessible only to 
    // authenticated users 
    return RedirectToAction("SomeProtectedAction", "SomeController"); 
} 

和保护的作用,你可以获取从这样的cookie中的当前连接的用户名里面:

[Authorize] 
public ActionResult SomeProtectedAction() 
{ 
    string username = User.Identity.Name; 

    // TODO: here you could query your database to find out more about 
    // the user given his username which must be unique 
    ... 
} 
+0

我'吨知道如何操纵饼干​​,但会很高兴,如果你能给我一些关键字甚至链接,了解它 – steavy 2012-03-28 12:41:28

+0

@steavy,发出你可以使用'FormsAuthentication.SetAuthCookie(用户名,假的)身份验证cookie;'其中username是经过身份验证的用户的用户名。我建议你阅读更多关于MSDN上的表单身份验证,以更好地了解它是如何工作的:http://msdn.microsoft.com/en-us/library/ff647070.aspx – 2012-03-28 12:44:13

1

当然你可以 - 而你的问题的第一部分的答案是'它取决于'。这取决于你如何/何时使用它。

内置认证将令牌存储在用于重新认证的cookie中。

作为一个警告 - 你需要一个很好的理由来实现这一点 - 很容易得到这个错误,并在您的网站留下漏洞。

0

是的,这是完全可能的(我们在这里不使用表单验证)。

但是;你需要承担全部责任一切,包括:

  • 认证
  • 安全地存储/处理对用户的一些象征性的(通常是唯一的HTTP cookie的)令牌的
  • 验证/用户对资源
  • 无效令牌(既可以防止重放,或注销)
  • 参与任何这种
  • 和什么的所有缓存即去错误(包括但不限于,一个坏的实施暴露出严重的安全故障)是完全你的错

当然很可以实现的,但需要做的很好的理由,并仔细。

(有什么不对?admin=true,是吗?)