0

我創建了一個非常簡單的授權屬性對於我的MVC控制器,是爲了重定向到一個控制器,允許顯示一個「未授權」消息:授權不工作的自定義authorizeattribute

public class ReportAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary 
     { 
      { "action", "ReportDenied" } 
      , { "controller", "Authorization"} 
     }); 
    } 
} 

我將其應用到我的主站點控制器上:

[ReportAuthorize([email protected]"Domain\GroupName")] 
public class ReportController : Controller 
{ 
    //etc 
} 

即使我在@「Domain \ GroupName」中,我也會被踢出局。實際上,如果我將其更改爲Users = @「Domain \ MyUserName」,它仍會失敗!

我已將其跟蹤到IIS設置匿名身份驗證,該站點已啓用。不幸的是,我不能禁用我們的生產系統上的匿名訪問,因爲這個項目是一個更大的MVC項目的一部分,其中許多其他控制器沒有正確的屬性。但是,當我在IIS中本地更改它時,我通常會進入。

現在,如果我換到正常的授權屬性:

[Authorize(Roles = @"Domain\GroupName")] 
public class ReportController : Controller 
{ 
    //etc 
} 

我得到了(我假設,因爲我還沒有定義,當未經授權的用戶試圖連接任何特殊的行爲)。

我有哪些方法可以解決此屬性問題?我只需要獲取ReportsAuthorize屬性,以在用戶匿名之前正確認證用戶。

回答

0

好的,所以在經歷了一些痛苦和痛苦之後,我終於解決了這個問題。請記住,問題的部分原因是此控制器位於較大的項目中,因此無法在IIS中禁用匿名身份驗證。

這裏的控制器:

[ReportAuthorize(Users = @"domain\me,domain\etc", Roles = @"domain\groupname")] 
[Authorize] 
public class ReportController : Controller 
{ 
    //etc 
} 

這裏的授權屬性:

public class ReportAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (Users.Contains(httpContext.User.Identity.Name) || Roles.Split(',').Any(s => httpContext.User.IsInRole(s))) //this if checks users and roles using OR logic 
     { 
      return true; 
     } 
     return false; 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary 
     { 
      {"action", "ReportDenied"} 
      , 
      {"controller", "Authorization"} 
     }); //this redirect sends you to a "not permitted" page 
    } 
} 

我所需要的授權屬性,使網站查詢域和加載帳戶信息。然後重寫authorizationcore自定義屬性驗證使用或邏輯值(而不是默認的與邏輯,通過使用兩個授權包含您需要的用戶/角色屬性中的一個證明)。

0

我原以爲你想檢查當前用戶是否通過身份驗證(filterContext.HttpContext.User.Identity.IsAuthenticated)。

如果沒有,請致電base.HandleUnauthorizedRequest這將可能最終會發送一個挑戰Windows憑據。

如果用戶已通過身份驗證,請實施您的重定向邏輯。

說了這麼多,是不是很簡單的使用標準AuthorizeAttribute並使用自定義錯誤顯示「未授權」頁面?

+0

與標準authorizeattribute的問題是,如果我放下一組名我不是一個部分的它挑戰我要我的憑據,但無法正確驗證我和反覆詢問,直到我取消。 – 2014-09-03 20:04:32

+0

@CBauer - 如果提示是你的問題,然後是,進入自定義屬性。根據我的經驗,這不是一個問題,因爲我會使用MvcSiteMapProvider之類的功能來啓用安全修剪功能,以便用戶看不到指向它們未授權的URL的鏈接。因此用戶很少遇到提示。 – Joe 2014-09-04 10:01:01

+0

不幸的是,我試圖保護的網頁是通過直接鏈接傳播的網站,如果我可以定位角色並讓沒有角色的人員轉發到「您不被允許訪問這個資源「頁面。 – 2014-09-04 12:11:29