如何在ServiceStack中创建经过身份验证的会话?

时间:2013-06-05 17:03:25

标签: servicestack

我的情况是我正在成功使用凭据验证,但我有时需要能够使用除用户的电子邮件地址之外的任何内容从服务内部创建经过身份验证的会话。我怎样才能做到这一点?我想我正在寻找与FormsAuthentication.SetAuthCookie()意图相似的东西,但我还没有找到它。

到目前为止,这是我的想法。假设我必须自己构建,我在CredentialsAuthProvider.TryAuthenticate

中看到了这一点
if (authRepo.TryAuthenticate(userName, password, out userAuth))
{
    session.PopulateWith(userAuth);
    session.IsAuthenticated = true;
    session.UserAuthId = userAuth.Id.ToString(CultureInfo.InvariantCulture);
    session.ProviderOAuthAccess = authRepo.GetUserOAuthProviders(session.UserAuthId)
        .ConvertAll(x => (IOAuthTokens)x);

    return true;
}

这似乎意味着我可以通过UserAuth中的IUserAuthRepository.GetUserAuthByUserName()对象自行完成阻止。我不认为这是足够的,因为会话没有保存在这里。向后工作,我发现TryAuthenticate由Authenticate调用,然后继续调用OnAuthenticated,其他事情发生,包括保存会话。我可以解析CredentialsAuthProvider的实例并自己调用OnAuthenticated吗?

我是在正确的轨道上,还是这是完全错误的做法?

1 个答案:

答案 0 :(得分:1)

有时需要能够仅使用用户的电子邮件地址从服务内部创建经过身份验证的会话。我怎样才能做到这一点?我想我正在寻找类似于FormsAuthentication.SetAuthCookie()的类似内容

我认为我能想到的最简单,最FormsAuthentication.SetAuthCookie()方式是修改服务中的AuthUserSession。下面的代码将获得Session,将IsAuthenticated设置为true,设置电子邮件并保存Session。

public class SomeService : Service
{
    public String Any(SomeRequest request)
    {
        //not sure you need it, but you could put some code here to verify the email is allowed to authenticate
        //and if true run the code below
        var sess = this.SessionAs<AuthUserSession>();
        sess.IsAuthenticated = true;
        sess.Email = "test@email.com";
        this.SaveSession(sess);

        return "success";
    }
}