ServiceStack授权 - 访问路由信息

时间:2012-03-21 14:08:11

标签: c# asp.net api servicestack

在ServiceStack的文档中,它说最佳做法是:

  

通常,ServiceStack调用方法bool HasPermission(string   在IAuthSession中获得许可。此方法检查列表是否存在   IAuthSession中的列表权限包含必需的   权限。

     

如上所述,IAuthSession存储在缓存客户端中   在方法OnAuthenticated中填写此列表,你已经覆盖了   本教程的第一部分。

我正在与现有系统集成,并使我的自定义BasicAuthProvider工作(继承自BasicAuthProvider基础)。身份验证工作正常,现在我正在构建授权部分。我计划使用上面列出的权限列表,但我需要访问路由信息以确定用户是否有权访问特定资源。我在IAuthServiceBase中看到有一个IRequestContext,它有绝对的URL,但在进行解析之前,我认为必须有一种方法来获取ServiceStack Route结构的访问权限,以便为我提供服务的类名被请求,或DTO所请求的服务与之相关。

以下是BasicAuthProvider类中的OnAuthenticated方法:

public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo)
    {


        UserSession sess = (UserSession)session;

        Model.User currentUser = UserRepository.GetUserByUsername(session.UserAuthName);

        //Fill the IAuthSession with data which you want to retrieve in the app eg:
        session.FirstName = currentUser.Person.FirstName;
        session.LastName = currentUser.Person.LastName;
        session.UserName = currentUser.User1;
        sess.CurrentUser = currentUser;
        //Important: You need to save the session!
        authService.SaveSession(session, TimeSpan.FromDays(1));
    }

在MVC下我使用了一些原始请求数据来获取Controller和Action名称,以确定资源授权,但这是我使用ServiceStack的第一个项目。

1 个答案:

答案 0 :(得分:2)

您可能会发现 [RequiredPermission] 属性甚至implementation属性都会对您有所帮助,例如: RequestFilter中传递的第三个参数是Request DTO。

由于请求DTO将1:1与服务进行映射,因此您可以确保该请求的目的地是IService<TRequest>(或其子类,例如ServiceBase<T>RestServiceBase<T>)。 您可以按照FilterAttributeCache

中的方式以编程方式访问服务类型
var serviceType = EndpointHost.Metadata.GetServiceTypeByRequest(requestDtoType);

我不确定您尝试支持的确切上下文/用例但是使用 [RequiredPermission] [RequiredRole] 属性可能有什么您需要在默认情况下验证内置 UserAuth 表中可用的角色和权限列表。

在外部,您可以使用/ assignroles和/ unassignroles Web服务(作为AuthorizationFeature插件的一部分)为用户分配角色和权限(默认情况下,它需要具有Admin角色的用户)。

有关详细信息,请参阅Authentication/Authorization上的文档页面和Validation上的ServiceStack GitHub project wiki