Аутентификация / PrincipalPermission не работает - PullRequest
4 голосов
/ 27 февраля 2011

Я работаю в 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();
    }

1 Ответ

3 голосов
/ 28 февраля 2011

С WCF вам нужно связать пользовательские принципалы с помощью очень специфического механизма , который прекрасно работает. Также обратите внимание, что атрибуты обычно не вызывают выполнение кода и вызываются только тогда, когда это явно сделано с помощью отражения (если вы не используете PostSharp). Вы не можете просто добавить атрибут и заставить его делать вещи автоматически. MVC и т.д. дают это впечатление , но в MVC есть код, проверяющий атрибуты и выполняющий их вручную.

...