我在WCF工作,正在编写基于IHttpModule
的身份验证管理器,它运行正常。我的Authentication
类中的一种方法会在GenericPrincipal
中创建一个Context.User
对象。
例如
app.Context.User = new GenericPrincipal(new GenericIdentity("Scott"), new string[] { "read" });
在Service
中的一个方法中,我想分配用户PrincipalPermissionAttribute
,但我不知道它应该如何工作,但它总是抛出SecurityException
。例如:
[WebGet(UriTemplate = "/", RequestFormat=WebMessageFormat.Xml, ResponseFormat=WebMessageFormat.Xml)]
[PrincipalPermission(SecurityAction.Demand, Role="read")] // it throw SecurityException
public SampleItem GetCollection()
{
bool user = HttpContext.Current.User.IsInRole("read"); // return true
bool user1 = HttpContext.Current.User.IsInRole("write"); // return false
return SampleItem.GetSampleItem();
}
也许PrincipalPremissionAttribute
不使用Context.Current.User
?但如果不是那么呢?
我尝试删除问题,并制作了一个非常简单的属性
[AttributeUsage(AttributeTargets.Method, AllowMultiple=true, Inherited=false)]
public class MyAuthorizationAttribute : Attribute
{
public MyAuthorizationAttribute(params string[] roles)
{
foreach (string item in roles)
{
if(HttpContext.Current.User.IsInRole(item) == false)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.StatusCode = 401;
HttpContext.Current.Response.AddHeader("WWW-Authenticate", "Basic Realm");
HttpContext.Current.Response.StatusDescription = "Access Denied";
HttpContext.Current.Response.Write("401 Access Denied");
HttpContext.Current.Response.End();
}
}
}
}
但应用程序无法使用此功能。我的意思是,当我在MyAttribute
构造函数上设置断点时,编译器不会停留在beakpoint上,它看不到它。
[WebGet(UriTemplate = "/", RequestFormat=WebMessageFormat.Xml, ResponseFormat=WebMessageFormat.Xml)]
[MyAuthorization("read")]
public SampleItem GetCollection()
{
bool user = HttpContext.Current.User.IsInRole("read"); // return true
bool user1 = HttpContext.Current.User.IsInRole("write"); // return false
return SampleItem.GetSampleItem();
}
答案 0 :(得分:3)
使用WCF,您需要通过very specific mechanism关联自定义主体,这可以正常工作。另请注意,属性通常 不会导致代码执行,只有在通过反射显式完成时才会调用(除非您使用的是PostSharp)。您不仅可以添加属性,还可以自动执行操作。 MVC等提供了印象,但MVC中有代码检查属性并手动执行。