ServiceStack自定义用户身份验证

use*_*791 5 c# authentication servicestack

有没有人有这个问题中所提出的如何使用int RefId的实际示例?

我正在尝试进行身份验证,但是我需要将userAuth数据与我自己的用户表结合使用。问题是我不知道如何将附加参数传递给“ / register”方法。我想我正在寻找类似“ OnAddUser”的事件,该事件使我可以向混合中添加一些其他参数。

我设法使用户注册工作非常迅速,这非常容易。也许问题是这太容易了?我可以看到它的工作原理,但是我不知道如何在它和数据库之间进行转换。

字典方法或RefId方法都可能对我有用,对我而言,如何使用它们都不是很明显。

是否可以完全覆盖创建用户?我发现此代码:

MyServices.cs

看起来好像是在用“ / register”代替创建用户,但是还有其他一些文章建议您不能覆盖ServiceStack DTO,必须使用默认表。

myt*_*thz 3

您可以通过使用RegisterService源代码的副本来包含您自己的注册服务,并对其进行修改以满足您的需求,例如,使用具有您想要的附加属性的自定义注册 DTO 。

但是,您可以轻松传递其他参数,而无需更改现有的 Register DTO,只需将其添加到?querystring您可以在服务中访问的:

var myParam = base.Request.QueryString["myParam"];
Run Code Online (Sandbox Code Playgroud)

否则,在注册或身份验证期间添加自定义逻辑的方法是利用现有的会话或身份验证事件

TechStacks 在其CustomAuthUserSession中有一个这样的示例:

public class CustomUserSession : AuthUserSession
{
    public string DefaultProfileUrl { get; set; }

    public string GithubProfileUrl { get; set; }
    public string TwitterProfileUrl { get; set; }

    public override void OnAuthenticated(IServiceBase authService, 
        IAuthSession session, 
        IAuthTokens tokens, 
        Dictionary<string, string> authInfo)
    {
        base.OnAuthenticated(authService, session, tokens, authInfo);
        var appSettings = authService.TryResolve<IAppSettings>();
        var userAuthRepo = authService.TryResolve<IAuthRepository>();
        var userAuth = userAuthRepo.GetUserAuth(session, tokens);
        var dbConnectionFactory = authService.TryResolve<IDbConnectionFactory>();
        foreach (var authTokens in session.ProviderOAuthAccess)
        {
            if (authTokens.Provider.ToLower() == "github")
            {
                GithubProfileUrl = session.GetProfileUrl();
            }
            if (authTokens.Provider.ToLower() == "twitter")
            {
                TwitterProfileUrl = session.GetProfileUrl();
                if (appSettings.GetList("TwitterAdmins").Contains(session.UserName) 
                    && !session.HasRole(RoleNames.Admin))
                {
                    userAuthRepo.AssignRoles(userAuth, roles:new[]{RoleNames.Admin});
                }
            }

            DefaultProfileUrl = GithubProfileUrl ?? TwitterProfileUrl;
            using (var db = dbConnectionFactory.OpenDbConnection())
            {
                var userAuthInstance = db.Single<CustomUserAuth>(x => 
                    x.Id == this.UserAuthId.ToInt());
                if (userAuthInstance != null)
                {
                    userAuthInstance.DefaultProfileUrl = this.DefaultProfileUrl;
                    db.Save(userAuthInstance);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当用户通过 GitHub 或 Twitter 登录时,它会获取用户的个人资料 URL。将在TwitterAdmins AppSetting中向用户分配Admin角色,这是向已知 Twitter 用户分配管理员权限的一种方式。最后,将检索到的配置文件 Url 添加到POCO 表并保存。 CustomUserAuth

TechStacks 告诉 ServiceStack 通过注册通用 OrmLiteAuthRepository来使用自己的 CustomUserAuth 表:

var authRepo = new OrmLiteAuthRepository<CustomUserAuth, UserAuthDetails>(dbFactory);
container.Register<IUserAuthRepository>(authRepo);
authRepo.InitSchema();
Run Code Online (Sandbox Code Playgroud)

现在它将在其中CustomUserAuth而不是默认UserAuth表中保存用户信息。