2

我试图在 ServiceStack.net 中实现一个 CustomAuthProvider。我需要使用第三个参数扩展用户名/密码。(让我们称它为 apikey)我也希望这个作为 application/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 始终为空。如果我以表格形式发布,上述工作正常。我确定我错过了一些东西,或者对如何做到这一点有一个完全错误的想法。我是 ServiceStack 的新手,但在一周的大部分时间里一直在查看示例和文章。:( 任何建议表示赞赏。

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

4

1 回答 1

2

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

我相信AuthServce 接受 Auth 对象,因此您的 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。

于 2013-05-20T16:20:25.267 回答