使用自定义servicestack AuthProvider

时间:2016-02-15 15:29:54

标签: c# .net servicestack httpserver

我正在尝试从ServerEventsClient访问我的自定义AuthProvider(继承自BasicAuthProvider)。 提供商代码非常简单ATM

public class RoomsAuthProvider : BasicAuthProvider
{
    public RoomsAuthProvider(AppSettings appSettings) : base(appSettings)
    {
    }

    public RoomsAuthProvider()
    {
    }

    public override bool TryAuthenticate(IServiceBase authService,
        string userName, string password)
    {
        return true;
    }

    public override IHttpResult OnAuthenticated(IServiceBase authService,
        IAuthSession session, IAuthTokens tokens,
        Dictionary<string, string> authInfo)
    {
        session.FirstName = "some_firstname_from_db";
        return base.OnAuthenticated(authService, session, tokens, authInfo);
    }
}

我像往常一样注册:

public override void Configure(Funq.Container container)
{
    container.Register<ICacheClient>(new MemoryCacheClient());

    Plugins.Add(new AuthFeature(() => new AuthUserSession(),
        new IAuthProvider[]
        {
            new RoomsAuthProvider()
        }));

    Plugins.Add(new ServerEventsFeature());
}

我的客户是:

var client = new ServerEventsClient("http://localhost:1337/", "home")

尝试进行身份验证:

var authResponse = client.Authenticate(new Authenticate
{
    provider = "RoomsAuthProvider",
    UserName = "test@gmail.com",
    Password = "p@55w0rd",
    RememberMe = true,
});

我总是得到NotFound错误,并且rror声明没有为此AuthProvider设置配置。在提供程序中设置名称和域名没有帮助。是否有这种类型的客户端的另一个身份验证流程或我错过了什么?欢迎任何想法

1 个答案:

答案 0 :(得分:2)

当你继承BasicAuthProvider时,你也会继承它provider name除非你覆盖它,否则是default is "basic"(即它不是继承的名称)类)。

但是BasicAuthProvider实现了HTTP Basic Auth,因此您打算通过HTTP基本身份验证而不是通过Web服务调用来调用它。

如果您尝试通过Web服务调用进行身份验证,则应继承CredentialsAuthProvider,而不是通过用户名/密码进行身份验证的身份验证方法,就像您在示例中所做的那样。 CredentialsAuthProvider的提供商名称为credentials,因此您的客户来电将是:

var authResponse = client.Authenticate(new Authenticate
{
    provider = "credentials",
    UserName = "test@gmail.com",
    Password = "p@55w0rd",
    RememberMe = true,
});