4

我在 WCF 工作,正在编写基于它的身份验证管理器,IHttpModule它工作正常。我的Authentication类中的方法之一GenericPrincipalContext.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构造函数上设置断点时,编译器不会在断点处停止,它看不到它。

    [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();
    }
4

1 回答 1

3

使用 WCF,您需要通过一种非常具体的机制来关联自定义主体,这可以正常工作。另请注意,属性通常 不会导致代码执行,并且仅在通过反射显式完成时才被调用(除非您使用的是 PostSharp)。您不能只添加一个属性并让它自动执行操作。MVC 等给人的印象是,但 MVC 中有代码检查属性并手动执行它们。

于 2011-02-27T21:14:08.623 回答