ServiceStack.net使用其他参数实现CustomAuthProvider?

时间:2013-05-20 01:06:55

标签: servicestack

我试图在ServiceStack.net中实现CustomAuthProvider。我需要使用第3个参数扩展用户名/密码。 (我们称之为apikey)我也希望这个接受post / app / json

public override bool TryAuthenticate(ServiceStack.ServiceInterface.IServiceBase authService, string userName, string password)
{
    if (String.IsNullOrEmpty(userName) || String.IsNullOrEmpty(password))
        return false;

    var httpReq = authService.RequestContext.Get<IHttpRequest>();

    string apiKey = httpReq.GetParam("apikey");

    if (String.IsNullOrEmpty(apiKey))
        return false;

    var engine = Helpers.DbHelper.GetEngine();
    return engine.Account.ValidateApiKey(userName, password, apiKey);
}

我的有效负载看起来像

{
    "UserName"="my.user", 
    "Password"="$thePassword!1", 
    "Apikey"="theapikey"
}

用户名和密码到达TryAuthenticate(),但apikey始终为null。如果我作为表格发布,上述工作正常。我确定我错过了一些东西,或者对如何做到这一点有完全错误的想法。我是ServiceStack的新手,但在一周的大部分时间里一直在查看示例和文章。 :(任何建议表示赞赏。

注意:我正在使用Advance Rest Client Chrome扩展程序作为我的测试。

1 个答案:

答案 0 :(得分:2)

您可以将Apikey参数添加为Querystring(http://localhost:1337/api/auth/credentials?Apikey=theapikey)的一部分吗?

我相信AuthServce accepts an Auth object所以你的Request的InputStream将被反序列化为Auth对象。这将忽略您的Apikey参数。我不相信你可以在TryAuthenticat覆盖中重新读取Request的InputStream以取出Apikey

如果您将ApiKey添加到查询字符串,则可以在TryAuthenticate覆盖中将其拉出。

var req = authService.RequestContext.Get<IHttpRequest>();
var apiKey = req.QueryString["Apikey"];

您也可以编写自己的服务,接受UserName, Password and ApiKey的对象。您可以验证Apikey,然后只调用UserName和Password参数调用AuthService。