3

我有 REST 服务要求,其中一些调用需要身份验证,而有些则不需要。绝对不使用任何状态,因为调用都是相互独立的。我已经把一些似乎可行的东西放在一起,但这是不使用会话的正确方法吗?

这个问题与我在此处回答的 WCF 问题有点相关。

首先我注册了认证方法:

        Plugins.Add(new AuthFeature(() => new AuthUserSession(),
                                    new IAuthProvider[] {
                                        new CustomCredentialsAuthProvider(), //HTML Form post of UserName/Password credentials
                                    }
                        ));

然后,我将各个调用(或服务或 DTO)赋予 Authenticate 属性:

[Authenticate]
public HelloResponse Post(Hello request)
{
    return new HelloResponse { Result = "Hello, " + request.Name  + " with POST & Auth"};
}

我从进行身份验证的 BasicAuthProvider 类继承:

public class CustomCredentialsAuthProvider : BasicAuthProvider
{
    public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
    {
        return userName == "dylan" && password == "abc123";
    }

    public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo)
    {
        session.IsAuthenticated = true;

        //Important: You need to save the session!
         authService.SaveSession(session, new TimeSpan(0,0,10)); 
    }
}

如您所见,我确实保存了会话,但它在 10 秒后超时。这是我确信可以做得更好的部分。不过,它似乎工作得很好。

有没有更好的方法来做我想要完成的事情?由于这些服务的无会话性质,还有什么方法可以删除 Auth、AssignRoles 和 UnassignRoles 方法?

4

1 回答 1

3

如果您想继续使用ServiceStack 的身份验证会话支持,您可以添加一个响应过滤器,在服务执行后清除用户会话,例如:

this.ResponseFilters.Add((req, res, dto) => req.RemoveSession());

基本上在每个请求执行后它都会清除会话,因此不存在它们经过身份验证的记录。

否则,您可以完全跳过使用 ServiceStack 的身份验证,只需通过FilterAttributes的RequestFitlers提供您自己的身份验证(这本质上是 SS Auth 在幕后所做的)。

于 2013-01-11T03:43:04.440 回答