나는 단일 사용자가 다른 출처에서 로그인 할 수있는 유사한 상황을 가지고 있습니다. 제 경우에는 사이트와 소셜 네트워크에서도 로그인 할 수있는 가능한 모든 인증에 대한 모든 전자 메일을 로그인 할 수 있습니다.
각각의 경우에 대해 세관 인증 공급자를 만들고 각 로그인 방법에 필요한 모든 정보를 인증 논리를 따르도록 유지하는 것이 좋습니다. 이 경우
이 컨테이너가 주어질거야가 사용자 정의 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;
}
과 같은 프로세스가 등 페이스 북, 구글 +와 같은 다른 사용자 지정 공급자가 와야을, 적어도이 방법은 괜찮 았는데 나를 위해.