Обратитесь к диаграммам высокого уровня в Документах аутентификации ServiceStack , чтобы объяснить, как провайдеры аутентификации на основе сеансов и IAuthWithRequest
Провайдеры аутентификации работают.
Многие из этих вопросов являются внутренними подробностями реализации, они вызываются, когда они нужны их различным провайдерам аутентификации. Переопределяемые пользователем события, к которым можно добавить пользовательскую логику, публикуются в События сеанса и аутентификации .
PreAuthenticate()
вызываются IAuthWithRequest
провайдерами аутентификации , которые аутентифицируются по запросу, например ключ API и JWT провайдерами аутентификации. Authenticate()
вызывается при аутентификации через /auth
провайдера.
Реализация подтверждения по электронной почте
Самый простой способ реализовать пользователей, которым требуется подтвержденная электронная почта, вероятно, это реализовать Пользовательскую проверку пользовательских сеансов что-то вроде:
public class CustomUserSession : AuthUserSession
{
public override IHttpResult Validate(IServiceBase authService, IAuthSession session,
IAuthTokens tokens, Dictionary<string, string> authInfo)
{
using (var db = HostContext.AppHost.GetDbConnection(authService.Request))
{
var userAuthId = int.Parse(session.UserAuthId);
if (!db.Exists<CustomUserAuth>(x => x.Id == userAuthId && x.EmailConfirmed))
return HttpError.Conflict($"Email not confirmed") as IHttpResult;
}
return null;
}
}
Таким образом, аутентификация разрешается только в том случае, если у пользователя есть подтвержденный адрес электронной почты.
См. Расширение таблиц UserAuth , чтобы узнать, как использовать пользовательские UserAuth
таблицы с дополнительными метаданными, такими как EmailConfirmed
.
Тогда вашей службой электронной почты будет Служба, которая принимает случайную строку, например Guid
(либо в CustomUserAuth
, либо в отдельной таблице), которая указывает, какой пользователь подтвердил свою электронную почту. В качестве альтернативы ссылка в электронном письме может просто снова включить электронное письмо, и в этом случае вы можете сопоставить его с существующим электронным письмом в поле Email
в таблице CustomUserAuth
.
Если вы затем хотите аутентифицировать пользователя в том же запросе, вы можете разрешить Аутентифицированные запросы без пароля , настроив CredentialsAuthProvider
с помощью:
new CredentialsAuthProvider {
SkipPasswordVerificationForInProcessRequests = true,
}
Который затем позволит вам проходить аутентификацию в том же самом запросе "в процессе" только с именем пользователя:
using (var service = base.ResolveService<AuthenticateService>()) //In Process
{
return service.Post(new Authenticate {
provider = AuthenticateService.CredentialsProvider,
UserName = request.UserName,
UseTokenCookie = true, // if using JWT
});
}
Вы можете использовать UseTokenCookie для аутентификации пользователя с помощью сеанса JWT только для HTTP , хотя использование JWT не требуется.
Для этого решения это не требуется, но вы можете добавить дополнительную информацию к токену JWT с помощью , реализующей CreatePayloadFilter , и заполнить эти дополнительные метаданные в сеансе пользователя с помощью PopulateSessionFilter
.
Я не знаю, как добавить EmailConfirmed = true к сеансу
Вы можете заполнить UserSession, внедрив OnAuthenticated()
в свой Custom AuthUserSession
.
В основном я хочу ограничить доступ ко всем службам, отмеченным [Аутентификация], для пользователей, которые подтвердили свои адреса электронной почты.
Переопределение Validate()
в пользовательской сессии AuthUserSession, как указано выше, гарантирует, что только пользователи с подтвержденными электронными письмами могут проходить аутентификацию.
Исключением из этого правила могут быть некоторые услуги
Не существует понятия «частично аутентифицированный пользователь», который вы либо аутентифицировали (и у вас есть Аутентифицированный UserSession, присоединенный к Запросу или Кэшу), либо нет. Я бы разрешил Аутентификацию только в том случае, если они подтвердили свою электронную почту, и обновил свою подтвержденную электронную почту только в том случае, если они подтвердили предложенную электронную почту и хотят изменить ее на
.