2

서비스 인증에 여러 인증 방법을 추가 할 수 있습니까? 다섯 명의 사용자가 있습니다.ServiceStack 혼합 인증 방법, 여러 조직 및 방법 AD FS2, openId, facebook, google

1. User 1 (Facebook account, Organization 1) 
2. User 2 (Google account, Organization 1) 
3. User 3 (AD FS2, Organization 2, https://company2.com/adfs/ls/) 
4. User 4 (AD FS2, Organization 3, https://company3.de/adfs/ls/) 
5. User 5 (AD FS2, Organization 3, https://company3.de/adfs/ls/) 

인증 방법은 사용자가 전자 메일로 선택해야합니다. 모든 사용자는 정확히 하나의 조직에 속하며 전자 메일은 고유합니다.

AD FS2로 사용자를 인증하는 방법은 무엇입니까? 여러 인증 공급자 및 메서드를 구현하는 방법은 무엇입니까?

답변

1

나는 단일 사용자가 다른 출처에서 로그인 할 수있는 유사한 상황을 가지고 있습니다. 제 경우에는 사이트와 소셜 네트워크에서도 로그인 할 수있는 가능한 모든 인증에 대한 모든 전자 메일을 로그인 할 수 있습니다.

각각의 경우에 대해 세관 인증 공급자를 만들고 각 로그인 방법에 필요한 모든 정보를 인증 논리를 따르도록 유지하는 것이 좋습니다. 이 경우

이 컨테이너가 주어질거야가 사용자 정의 aperations에 대한이 종속성을 해결할 수

Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] 
{ 
        container.Resolve<CustomFacebookProvider>(), 
        container.Resolve<CustomAuthProvider>(), 
        container.Resolve<CustomGoogleOpenIdOAuthProvider>(), 
})); 

같은이 될 수 해야하는 요금 인증 공급자의 각 하나에 당신의 지속성 계층을 통합해야 당신은 예를 들어 사용자 로그인의 유효성을 검사하기 위해해야 ​​할 어떤 논리 실행

public class CustomAuthProvider : CredentialsAuthProvider 
    { 
     public new static string Name = AuthService.CredentialsProvider; 
     public new static string Realm = "/auth/" + AuthService.CredentialsProvider; 
     private readonly IUserRepository _userRepository; // custom repo 


     public CustomAuthProvider(IUserRepository userRepository, IResourceManager appSettings) 
      : base(appSettings) 
     { 
      _userRepository = userRepository; 
      CallbackUrl = appSettings.GetString("oauth.{0}.CallbackUrl".Fmt(Name)); 
      RedirectUrl = appSettings.GetString("oauth.{0}.RedirectUrl".Fmt(Name)); 
      SessionExpiry = DefaultSessionExpiry; 

     } 


     public override object Authenticate(IServiceBase authService, IAuthSession session, 
              ServiceStack.ServiceInterface.Auth.Auth request) 
     { 

      string userName = request.UserName; 
      string password = request.Password; 

      if (!LoginMatchesSession(session, userName)) 
      { 
       authService.RemoveSession(); 
       session = authService.GetSession(); 
      } 

      if (TryAuthenticate(authService, userName, password)) 
      { 
       authService.SaveSession(session, SessionExpiry); 
       if (session.UserAuthName == null) 
        session.UserAuthName = userName; 
       OnAuthenticated(authService, session, null, null); 
       return new AuthResponse 
       { 
        UserName = userName, 
        SessionId = session.Id, 
        ReferrerUrl = RedirectUrl 
       }; 
      } 

      throw new HttpError(HttpStatusCode.BadRequest, "400", "Invalid username or password"); 

     } 

     public override bool TryAuthenticate(IServiceBase authService, string userName, string password) 
     { 
      IAuthSession session = authService.GetSession(); 
      User user = _userRepository.GetByUserName(userName); 
      if (_userRepository.login(username,password)) //or any other validation logic here 
      { 
       session.IsAuthenticated = true; 
       session.UserAuthId = string.Format("{0}", user.Id); 
       session.Id = authService.GetSessionId(); 
       session.LastModified = user.LastLoginDate; 
       session.DisplayName = user.DisplayName; 
       session.Email = user.Email; 
       session.UserName = user.UserName; 
       user.LastLoginDate = DateTime.Now; 
       _userRepository.Update(user); //custom logic 
       return true; 
      } 

      return false; 
     } 

과 같은 프로세스가 등 페이스 북, 구글 +와 같은 다른 사용자 지정 공급자가 와야을, 적어도이 방법은 괜찮 았는데 나를 위해.