WCF:如何在HttpModule与ServiceAuthorizationManager中获取请求的Web方法名
嘿,这事儿我熟!你打算用HttpModule和重写ServiceAuthorizationManager的CheckAccessCore方法来做身份授权,还要获取Web方法名实现方法级权限控制,下面分两种场景给你说清楚怎么操作:
当你重写CheckAccessCore时,直接通过传入的OperationContext就能轻松拿到当前请求的Web方法名,代码示例如下:
protected override bool CheckAccessCore(OperationContext operationContext) { // 直接获取当前请求的Web方法名 string webMethodName = operationContext.CurrentOperation.Name; // 这里就可以结合用户角色做授权判断了 // 比如调用自定义方法,验证当前用户是否有权访问该Web方法 bool hasPermission = VerifyUserRoleForMethod(webMethodName, GetCurrentUserRoles()); // 别忘了结合基类的验证逻辑 return hasPermission && base.CheckAccessCore(operationContext); }
如果需要包含命名空间的完整操作标识,也可以用operationContext.IncomingMessageHeaders.Action获取,再从中提取方法名即可。
2. 在HttpModule中获取Web方法名
分两种情况处理,取决于你是WCF服务还是普通ASP.NET Web服务:
针对托管在IIS的WCF服务
在HttpModule里可以直接获取OperationContext来拿到方法名:
public class AuthHttpModule : IHttpModule { public void Init(HttpApplication context) { context.AuthenticateRequest += OnAuthenticateRequest; } private void OnAuthenticateRequest(object sender, EventArgs e) { HttpApplication app = (HttpApplication)sender; OperationContext opContext = OperationContext.Current; if (opContext != null) { string webMethodName = opContext.CurrentOperation.Name; // 执行授权逻辑,无权限则返回403 if (!VerifyUserRoleForMethod(webMethodName, GetCurrentUserRoles())) { app.Response.StatusCode = 403; app.Response.End(); } } } // 补充实现GetCurrentUserRoles、VerifyUserRoleForMethod等自定义方法 }
针对普通ASMX Web服务
可以通过解析请求路径提取方法名:
private void OnAuthenticateRequest(object sender, EventArgs e) { HttpApplication app = (HttpApplication)sender; string pathInfo = app.Context.Request.PathInfo; // PathInfo格式一般是 /WebMethodName,截取后面的部分就是方法名 if (!string.IsNullOrEmpty(pathInfo) && pathInfo.StartsWith("/")) { string webMethodName = pathInfo.Substring(1); // 执行你的授权逻辑 } }
最后提个小建议:你可以维护一个权限配置表(比如记录角色与可访问方法的对应关系),这样授权逻辑会更灵活易维护。
内容的提问来源于stack exchange,提问作者DooDoo
相关产品推荐
相关产品推荐

