2012-10-04 20 views
0

我有一个应用程序,其中一个用户名可以属于许多公司。因此,为了区分它们,我需要使用用户名和密码作为唯一对来登录。如何在asp.net中使用3个参数登录mvc

我正在使用ASP.NET MVC,我很想知道登录发生的位置。 其实我可以看到它验证用户的位置,但我找不到它检索用户的位置。

那么,其中username = XX和密码= XX发生

选择用户?

不同地问:我没有找到用户设置?我看到User.Identity.Name它的代码,但我没有看到: 用户=选择....

感谢 约翰

+0

如果两个用户(约翰)从两个不同的公司(A和B)都希望使用的密码(“thisisabadpassword “)? – hometoast

+0

好问题:目前我不会允许这个。 – user96547

+0

你在VS2010中使用MVC模板吗?如果 –

回答

3

约翰,你正在使用MVC。除了LINQ语法外,您不会在代码中看到任何查询。我猜你正在尝试做的是用户表和公司表之间的多对多关系。 (一个用户有多个公司,一个公司有多个用户) 非常多的数据库明智这意味着你需要一个额外的表,公司和用户的两个首要键。

回到你的问题。 ASP.net MVC有自己的会员供应商。你可以选择使用默认的表格或覆盖它,并创建你自己的定制会员供应商(有能力使用你自己的用户表)

默认的一个应该包含大部分基本属性。 (密码重置,密码盐,电子邮件..) http://www.asp.net/web-forms/tutorials/security/membership/creating-the-membership-schema-in-sql-server-cs 跳到步骤:安装应用程序服务生成表

但是猜你已经有一个数据库,你自己的用户表。你应该覆盖自定义成员资格类。

只要这意味着你做的是从抽象类“的MembershipProvider”

public class MyMembershipProvider : MembershipProvider 
{ 

} 

继承之后,你必须让ASP知道你将覆盖与你默认的MembershipProvider在网络的新类的.config

<membership defaultProvider="MyMembershipProvider"> 
     <providers> 
     <clear /> 
     <add name="MyMembershipProvider" 
      applicationName="MyApp" 
      Description="My Membership Provider" 
      passwordFormat="Clear" 
      connectionStringName="MyMembershipConnection" 
      type="MyApp.MyMembershipProvider" /> 
     </providers> 
    </membership> 

的成员资格提供一些方法需要你返回或使用的对象的MembershipUser。如何实现这一切就在这里: http://msdn.microsoft.com/en-us/library/system.web.security.membershipuser.aspx 这不是一个必要的步骤,但其建议。

祝你好运:)约翰如果 在孤单的解释混淆,不要犹豫问

+0

谢谢安东尼。你对模型部分是正确的。所以我创建了一个自定义MemberShipser。现在我看不到我的用户在哪里?我已经重载了VerifyMethod,但我没有看到在哪种方法中我将创建用户?如果它是GetUser,它将在哪里被调用? – user96547

+0

除非你已经实现了自定义membershipprovider(一个实现接口MembershipProvider方法的类),否则你不能对membershipuser做任何事情。实现您的Web应用程序所需的方法。 (我建议写一个单独的库用于用户表,并在成员类中使用它。我建议建立一个为的MembershipUser因为Membership.getUser()返回该类的对象的原因。总之,这意味着你从读取当前用户数据库与存储库,并使用属性来填充membershipuser对象 –

1

答案很简单:

你的代码描述发生在账户控制器的登录操作幕后:

MembershipService.ValidateUser(model.UserName, model.Password) 

这对于一个有效的用户返回true。

FormsService.SignIn(model.UserName, model.RememberMe) 

(你可以看到Models文件夹下,都在AccountModels定义的那些功能的文件)

如果你也想:用户然后在下一行代码“登录”在验证用户的同时检查公司ID,然后您需要编写自己的验证方法来替换ValidateUser。 THS将取决于你正在使用的为您的商店(SQL?)

但是,作为一个更广泛的观点,最佳做法,你不应该允许不同的用户相同的用户名。这只是一个坏主意,会导致麻烦。

UPDATE:

如果我是建议如何做到这一点,我建议你的用户ASP.NET成员资格的用户配置方面。它旨在捕获和存储其他用户变量(例如公司),同时仍然使用他们为您编写的精心构建和安全的成员资格。阅读它,但下面是我目前正在开发的应用程序中的CreateUser函数。请注意我如何使用配置文件来存储名和姓,以及用户需要重置密码的标志。

同样,这将抢先拥有多个用户使用相同用户名的能力,但我真的认为你应该避免这种情况。

[HttpPost] 
public ActionResult CreateUser(string username, string email, string first, string last, string role) 
{    
    string password; 
    MembershipUser user; 

    //Generate a random password 
    password = Auth.CreateRandomPassword(6); 

    try 
    { 
     //Create the user 
     user = Membership.CreateUser(username, password, email); 

     //Add the user to the chosen role 
     Roles.AddUserToRole(username, role); 

     //Create the user profile 
     UserProfile profile = UserProfile.GetUserProfile(username); 

     profile.FirstName = first; 
     profile.LastName = last; 
     profile.ForcePasswordReset = true; 

     profile.Save(); 

     EmailNewUser(username, email, password); 

    } 
    catch (Exception ex) 
    {     
     HttpContext.Response.StatusCode = 500; 
     HttpContext.Response.StatusDescription = ex.Message; 
     HttpContext.Response.Clear(); 
    } 

    return PartialView("UserTable", Auth.Users()); 

} 
+0

FormsService.SignIn不会出现在我的应用程序.. – user96547

+0

根据Visual Studio和MVC的版本,您正在使用,也可能是不同的封装或根本没有。被封装的功能是“FormsAuthentication.SetAuthCookie()”,它是在system.web.security库。 –

+0

你是对的,它是SetAuthCookie。这个名字是如此糟糕......但后来我在哪里/从我自己的DB – user96547

相关问题