2012-01-07 77 views
0

扩展C1登录功能的最佳做法是什么?希望通过用多因素身份验证替换密码身份验证来将功能扩展到当前登录过程。我有兴趣了解C1中的关键概念和钩子,以便在完成多因素身份验证后允许将用户身份验证转换为C1。扩展系统登录功能

回答

0

你看了这个讨论http://compositec1.codeplex.com/discussions/268428?这里有用于实现ILoginProvider接口的类的示例代码,它在验证用户名/密码组合时被调用。

public class LDAPLoginProvider : IFormLoginProvider 
{ 
    public bool CanSetUserPassword 
    { 
      get { return false; } 
    } 

    public bool CanAddNewUser 
    { 
      get { return false; } 


    public bool UsersExists 
    { 
      get { return DataFacade.GetData<IUser>().Any(); } 
    } 

    public IEnumerable<string> AllUsernames 
    { 
     get { return (from u in DataFacade.GetData<IUser>() select u.Username).ToList(); } 
    } 

    void SetUserPassword(string username, string password) 
    { 
     throw new NotImplementedException(); 
    } 

    void AddNewUser(string userName, string password, string group) 
    { 
     throw new NotImplementedException(); 
    } 

    LoginResult Validate(string username, string password) 
    { 
     var user = 
      (from u in DataFacade.GetData<IUser>() 
      where String.Compare(u.Username, username, StringComparison.InvariantCultureIgnoreCase) == 0 
      select u).FirstOrDefault(); 

     if (user == null) 
     { 
      return LoginResult.UserDoesNotExist; 
     } 

     bool loginIsValid = false; 

     try 
     { 
      var entry = new DirectoryEntry("LDAP://domain.com", username, password); 
      object nativeObject = entry.NativeObject; 
      loginIsValid = true; 
     } 
     catch (DirectoryServicesCOMException ex) 
     { 
      //not authenticated; reason why is in ex 
     } 
     catch (Exception ex) 
     { 
      //not authenticated due to some other exception 
     } 

     return loginIsValid ? LoginResult.Success : LoginResult.IncorrectPassword; 
    }   
} 

这里用户仍然需要在C1中创建,但密码是针对外部源(这里是LDAP服务器)进行验证的。