2012-06-21 149 views
0

我正在开发一个使用ASP.NET MVC 3的项目,现在使用MembershipProvider,RoleProvider AuthorizeAttribute和custom。所以在代码中使用这个的某些部分:ASP.NET MVC 3 AuthorizeAttribute

[Logon(Roles = "login, test1")] 

此代码作品完美,使用中的MembershipProvider代码:

public override string [] GetRolesForUser (string username) 
{ 
    var = UsuarioRepository.GetListaPermissoesByUsuarioEmail permissions (username); 

    if (permissions == null) 
    { 
     nullPermissao var = new string [0]; 
     nullPermissao return; 
    } 

    return permissions; 
} 

我的问题是。我怎样才能使用下面的代码,哪个方法需要自定义? 我想检查是确定一个特定类型的用户是否已经登录,以及它是否具有某些特权。

[Logon(Roles = "login, test1," Users = "User1")] 

使用重写字符串[] GetRolesForUser(用户名字符串)方法它检查角色,在至极方法我可以检查用户?

+0

你们是不是要限制访问的方法,以特定的用户? – bluevector

+0

我不明白你的问题。你想达到什么目的? –

+0

对不起,我输入错误的方式,实际上是“登录”我从AuthorizeAttribute类创建的自定义属性。 –

回答

0

您是否打算使用以下内容?

[Authorize(Roles = "login, test1", Users = "User1")] 
+0

使用覆盖字符串[] GetRolesForUser(字符串用户名)方法它检查角色,在这种方法我可以检查用户? –

+0

不确定你在问什么,但这是正确的属性使用,然后你可以重写默认角色和成员资格提供程序,以自定义方式来控制您的用户和角色,而不是默认的aspnet数据库表。您必须更新web.config才能使用备用提供程序。 –

1

这应该与AuthorizeAttribute开箱即用。它会检查HttpContext.User.Identity.Name是否与您在AuthorizeAttribute下定义的任何术语相匹配。

正如我从注释中看到的那样,您在自己的LogonAttribute中可能覆盖了OnAuthorize方法。这是AuthorizeAtrribute的魔力所在。

原始ASP.NET MVC源

protected virtual bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    if (httpContext == null) 
    throw new ArgumentNullException("httpContext"); 
    IPrincipal user = httpContext.User; 
    return user.Identity.IsAuthenticated && (this._usersSplit.Length <= 0 || Enumerable.Contains<string>((IEnumerable<string>) this._usersSplit, user.Identity.Name, (IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase)) && (this._rolesSplit.Length <= 0 || Enumerable.Any<string>((IEnumerable<string>) this._rolesSplit, new Func<string, bool>(user.IsInRole))); 
} 

public virtual void OnAuthorization(AuthorizationContext filterContext) 
{ 
    if (filterContext == null) 
    throw new ArgumentNullException("filterContext"); 
    if (OutputCacheAttribute.IsChildActionCacheActive((ControllerContext) filterContext)) 
    throw new InvalidOperationException(MvcResources.AuthorizeAttribute_CannotUseWithinChildActionCache); 
    if (this.AuthorizeCore(filterContext.HttpContext)) 
    { 
    HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
    cache.SetProxyMaxAge(new TimeSpan(0L)); 
    cache.AddValidationCallback(new HttpCacheValidateHandler(this.CacheValidateHandler), (object) null); 
    } 
    else 
    this.HandleUnauthorizedRequest(filterContext); 
}