首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >身份验证/ PrincipalPermission无效

身份验证/ PrincipalPermission无效
EN

Stack Overflow用户
提问于 2011-02-27 20:35:15
回答 1查看 2.4K关注 0票数 4

我在WCF工作,并正在编写基于IHttpModule的身份验证管理器,它工作得很好。我的Authentication类中的一个方法在Context.User中创建了一个GenericPrincipal对象。

例如

代码语言:javascript
复制
app.Context.User = new GenericPrincipal(new GenericIdentity("Scott"), new string[] { "read" });

Service中的一种方法中,我想分配用户PrincipalPermissionAttribute,我不知道它应该如何工作,但是它总是抛出一个SecurityException。例如:

代码语言:javascript
复制
    [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?但如果不是那又怎样?

我尝试删除这个问题,并创建了一个非常简单的属性。

代码语言:javascript
复制
[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上,它不会看到它。

代码语言:javascript
复制
    [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();
    }
EN

回答 1

Stack Overflow用户

发布于 2011-02-27 21:14:08

使用WCF,您需要通过非常具体的机制关联自定义主体,这很好。还请注意,属性通常不会导致代码执行,只有在通过反射显式完成时(除非使用PostSharp),才会调用属性。您不能仅仅添加一个属性并让它自动完成任务。MVC等给人留下了这样的印象,但是MVC中有代码检查属性并手动执行它们。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5135770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档