在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的第一个项目。
答案 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。