在ServiceStack中使用EFx进行身份验证的正确方法是什么?

时间:2014-03-30 20:28:05

标签: entity-framework authentication servicestack

我们最近在与MVC 4网页服务器相同的解决方案中切换到ServiceStack以获取我们的ReSTful Web服务,到目前为止,我们发现它很容易使用。但是,我们的问题是我们想要添加基本身份验证,并且关于该主题的每篇文章和博客都使它看起来更复杂和“棘手”(他们的话),而不是一个让其他一切变得如此简单的工具。我们已经在数据库中使用“Basic xxx”字符串,我们使用Entity Framework通过DAL模式访问该字符串。我们可以将“Authenticate”标头中的值与我们的数据库值进行比较,但这是粗略的方式。我们不想加载另一个库(例如,OrmLite)或创建其他表。

我的问题是......鉴于我已经说过的关于我们的实现的内容,是否有一种简单的方法可以说“这是我们存储的'基本xxx'字符串”在正确的位置/时间?或者我们是否必须覆盖IUserAuthRepository并在IAuthProvider的覆盖中使用它?这看起来很简单,直到你看到网络上可用的其他实现,然后你们都会感到困惑。

提前感谢您的回复! 马库斯

1 个答案:

答案 0 :(得分:1)

实施您自己的Basic AuthProvider

您只需要继承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]属性保护您的服务。

使用内置的ServiceClient'

发送基本身份验证

ServiceStack .NET Service Clients通过设置UserName / Password字段,内置对Basic Auth请求的支持,即:

var client = new JsonServiceClient { 
    UserName = username,
    Password = password
};

现在,当遇到未经身份验证的请求时,会自动使用BasicAuth凭据重新发送请求。要始终在每个请求上发送BasicAuth,您可以设置:

client.AlwaysSendBasicAuthHeader = true;

使用全局请求过滤器手动验证BasicAuth

使用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
        }
    }
}