我们最近在与MVC 4网页服务器相同的解决方案中切换到ServiceStack以获取我们的ReSTful Web服务,到目前为止,我们发现它很容易使用。但是,我们的问题是我们想要添加基本身份验证,并且关于该主题的每篇文章和博客都使它看起来更复杂和“棘手”(他们的话),而不是一个让其他一切变得如此简单的工具。我们已经在数据库中使用“Basic xxx”字符串,我们使用Entity Framework通过DAL模式访问该字符串。我们可以将“Authenticate”标头中的值与我们的数据库值进行比较,但这是粗略的方式。我们不想加载另一个库(例如,OrmLite)或创建其他表。
我的问题是......鉴于我已经说过的关于我们的实现的内容,是否有一种简单的方法可以说“这是我们存储的'基本xxx'字符串”在正确的位置/时间?或者我们是否必须覆盖IUserAuthRepository并在IAuthProvider的覆盖中使用它?这看起来很简单,直到你看到网络上可用的其他实现,然后你们都会感到困惑。
提前感谢您的回复! 马库斯
答案 0 :(得分:1)
您只需要继承BasicAuthProvider并使用您自己的实现覆盖TryAuthenticate
方法,例如:
public class MyBasicAuthProvider : BasicAuthProvider
{
public override bool TryAuthenticate(IServiceBase authService,
string userName, string password)
{
return MyIsValidLogin(userName, password);
}
}
然后在注册AuthFeature时将其提供给ServiceStack,例如:
Plugins.Add(new AuthFeature(
() => new CustomUserSession(), //Use your own typed Custom UserSession type
new IAuthProvider[] {
new MyBasicAuthProvider()
});
这会插入ServiceStack的内置身份验证,允许您使用HTTP BasicAuth进行身份验证,并使用内置的[Authenticate]
属性保护您的服务。
ServiceStack .NET Service Clients通过设置UserName / Password字段,内置对Basic Auth请求的支持,即:
var client = new JsonServiceClient {
UserName = username,
Password = password
};
现在,当遇到未经身份验证的请求时,会自动使用BasicAuth凭据重新发送请求。要始终在每个请求上发送BasicAuth,您可以设置:
client.AlwaysSendBasicAuthHeader = true;
使用ServiceStack的内置身份验证的另一种方法是使用全局请求过滤器,手动提取BasicAuth用户名和密码,并在请求上设置一个标志,以指示请求已经过身份验证,例如:< / p>
this.GlobalRequestFilters.Add((req, res, dto) => {
var userAndPass = req.GetBasicAuthUserAndPassword();
if (userAndPass == null)
return;
var username = userAndPass.Value.Key;
var password = userAndPass.Value.Value;
if (MyIsValidLogin(username, password)) {
//Set a flag that will be available for the entire request:
req.Items["UserAuthenticatedWithBasicAuth"] = username;
}
});
现在ServiceStack's Request pipeline中的所有服务,属性过滤器和任何其他自定义逻辑都可以检查此标志是否已设置,例如:
public class MyServices : Service
{
public object Any(Request request)
{
var authenticatedUser = Request.Items["UserAuthenticatedWithBasicAuth"];
if (authenticatedUser != null) {
//this user was authenticated with BasicAuth
}
}
}