我有 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 方法?