Web服务 – ServiceStack Web服务安全性
嗨,我刚接触Servicestack并下载了他们非常全面的bootstrapapi示例并正在使用它,但我仍然遇到一些问题.问题在于安全性,发生的事情是我在尝试访问受保护的服务时遇到405错误.使用身份验证服务,似乎我正在进行身份验证.请帮忙解释一下.这是代码:
public class Hello { public string Name { get; set; } } public class AuthHello { public string Name { get; set; } } public class RoleHello { public string Name { get; set; } } public class HelloResponse { public string Result { get; set; } } 服务: public class HelloService : ServiceBase<Hello> { //Get's called by all HTTP Verbs (GET,POST,PUT,DELETE,etc) and endpoints JSON,XMl,JSV,etc protected override object Run(Hello request) { return new HelloResponse { Result = "Hello,Olle ?r en ?L ?l " + request.Name }; } } [Authenticate()] public class AuthHelloService : RestServiceBase<AuthHello> { public object Execute(Hello request) { return new HelloResponse { Result = "Hello," + request.Name }; } } [RequiredRole("Test")] public class RoleHelloService : RestServiceBase<RoleHello> { public object Execute(Hello request) { return new HelloResponse { Result = "Hello," + request.Name }; } } 这是AppHost: public class HelloAppHost : AppHostBase { //Tell Service Stack the name of your application and where to find your web services public HelloAppHost() : base("Hello Web Services",typeof(HelloService).Assembly) { } public override void Configure(Container container) { //Register all Authentication methods you want to enable for this web app. Plugins.Add(new AuthFeature(() => new AuthUserSession(),new IAuthProvider[] {new CustomCredentialsAuthProvider(),//HTML Form post of UserName/Password credentials })); container.Register<ICacheClient>(new MemoryCacheClient() { FlushOnDispose = false }); //register user-defined REST-ful urls Routes .Add<Hello>("/hello") .Add<Hello>("/hello/{Name}") .Add<AuthHello>("/AuthHello") .Add<RoleHello>("/RoleHello"); } } UPDATE 如果你用以下内容替换:RestServiceBase,那么一切都会正常工作所以现在问题就是为什么. 解决方法
首先查看wiki文档
我将首先浏览ServiceStack的Authentication Wiki中的文档,以更好地了解ServiceStack的身份验证的工作原理.维基中有很多文档,所以如果你不确定某些东西,你应该首先参考.这是一个社区维基,如果您认为它可以帮助其他人,请随意扩展它们. 如果行为不明确,请参阅源代码中的实现 如果你不确定什么东西,你应该将refer to the RequiredRole source code作为它的主要权威. RequiredRole只是一个Request Filter Attribute,它在每个具有该属性的服务之前运行. RequiredRole属性只将您的session.HasRole()方法调用为seen here: public bool HasAllRoles(IAuthSession session) { return this.RequiredRoles .All(requiredRole => session != null && session.HasRole(requiredRole)); } 因为它只是调用您的会话,所以如果您有自定义会话,则可以覆盖session.HasRole()的实现. 注册和实现CustomUserSession Social BootstrapApi项目确实实现了它自己的CustomSession registers here,但没有覆盖HasRole()实现,所以它使用基础AuthUserSession.HasRole()中的内置实现,它看起来像Roles集合,看看用户是否具有指定的角色他们的会议POCO: public virtual bool HasRole(string role) { return this.Roles != null && this.Roles.Contains(role); } 由AuthUserRepository填充的会话属性 Roles属性(以及用户Session上的大多数其他属性)由您指定的AuthUserRepository填充,例如如果您使用OrmLiteAuthRepository之类的OrmLiteAuthRepository,则Robe属性将保留在UserAuth RDBMS table的Roles列中.根据AuthUserRepository,您使用UserAuth / UserOAuthProvider POCO将存储为OrmLite中的RDBMS表或Redis中的文本blob等. 使用AssignRoles / UnAssignRoles服务管理角色和权限 因此,对于具有所需角色(以及传递授权)的用户,应将此角色添加到其UserAuth数据库行条目中. ServiceStack的AuthFeature包括2个用于管理用户权限和角色的服务: > /assignroles 如何最初给某人管理员角色 这些服务确实要求user with the Admin Role已经过身份验证. if (AppHost.Config.AdminUserNames.Contains(session.UserAuthName) && !session.HasRole(RoleNames.Admin)) { var assignRoles = authService.ResolveService<AssignRolesService>(); assignRoles.Execute(new AssignRoles { UserName = session.UserAuthName,Roles = { RoleNames.Admin } }); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |