是否可以禁用特定路由的身份验证提供程序?

时间:2017-03-13 17:35:27

标签: authentication servicestack

我们正在评估Web API的服务堆栈v.4.5.6.0,我们希望客户端能够使用基本身份验证或凭据进行身份验证,但我们不希望他们能够提供基本身份验证头使用我们的服务时,JWT令牌或会话cookie的位置。虽然我意识到这有点武断,但是有没有办法从特定提供商中排除路由,或者在他们登录后强制使用令牌/ cookie进行身份验证?

AppHost的Auth配置:

private void ConfigureAuth(Container container)
{
    var appSettings = new AppSettings();              
    this.Plugins.Add(new AuthFeature(() => new CustomAuthUserSession(),
         new IAuthProvider[]
          {
              new CredentialsAuthProvider(),
              new BasicAuthProvider(),
              new JwtAuthProvider(appSettings) 
          }) { IncludeAssignRoleServices = false, MaxLoginAttempts = 10} );

    var userRepository = new CustomUserAuthRepository(container.TryResolve<IDbConnectionFactory>());
    container.Register<IAuthRepository>(userRepository);

}

1 个答案:

答案 0 :(得分:2)

ServiceStack允许您决定要对您的服务进行身份验证的AuthProviders,但它不允许您单独配置哪些特殊AuthProviders应用于单个服务。随意add this a feature request

但是,如果您想确保只通过JWT访问服务,您可以在服务中添加FromToken的检查,表明会话由JWT令牌填充,例如:

[Authenticate]
public class MyServices : Service
{
    public object Any(MyRequest request)
    {
        var session = base.SessionAs<AuthUserSession>();
        if (!session.FromToken)
            throw HttpError.Unauthorized("Requires JWT Authentication");

        //...
    }
}

从现在为available on MyGet的v4.5.7开始,您还可以使用新的session.AuthProvider属性,该属性指示AuthProvider用于对用户进行身份验证的内容,例如:

public object Any(MyRequest request)
{
    var session = base.SessionAs<AuthUserSession>();
    if (session.AuthProvider != JwtAuthProvider.Name)
        throw HttpError.Unauthorized("Requires JWT Authentication");

    //...
}

请参阅different AuthProvider names for each AuthProvider的文档。