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只是一个@L_502_2@,它在每个具有该属性的服务之前运行.
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
> /unassignroles
如何最初给某人管理员角色
这些服务确实要求user with the Admin Role已经过身份验证.
您可以通过手动更改特定用户UserAuth.Role列以包含值“admin”来执行此 *** 作.相反,Social bootstrap API项目通过处理其CustomUserSession上的OnAuthenticated()事件来执行此 *** 作,该事件只是检查是否在Web.Config中声明了经过身份验证的用户名,如果是,则调用AssignRoles服务,为该经过身份验证的用户提供管理员角色:
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 } });}总结
以上是内存溢出为你收集整理的Web服务 – ServiceStack Web服务安全性全部内容,希望文章能够帮你解决Web服务 – ServiceStack Web服务安全性所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)