2011-09-30 27 views
0

在我的MVC2應用程序中,我希望大多數請求使用Forms身份驗證,並請求某些特定的URI來使用我的自定義身份驗證。爲了做到這一點,我添加了FormsAuthentication_OnAuthenticate()方法,並在內部檢查了URI,並且如果它是其中一個獨佔的URI,我想檢查請求標頭中的用戶名和密碼。如何在MVC中實現自定義驗證時終止請求處理?

問題是如果提供的憑據錯誤,如何終止請求。

我嘗試:

HttpContext context = args.Context; 

context.Response.Write("Wrong credentials"); 
context.Response.StatusCode = 401; 
context.Response.End(); 

但一旦出現這種情況的請求轉發到在web.config中指定下

<authentication mode="Forms"> 
     <forms loginUrl="~/LogOn"/> 
</authentication> 

我想請求被終止的URI - 使得該響應被髮送到客戶端並且連接被關閉。我如何實現這一目標?

回答

1

只要您發送401狀態碼,Forms Authentication模塊就會攔截此代碼並自動重定向到登錄頁面。在ASP.NET MVC中處理身份驗證的正確方法是使用[Authorize]屬性。如果你不希望它重定向到登錄頁面,而是顯示出一些觀點,你可以寫一個自定義的授權屬性,並覆蓋HandleUnauthorizedRequest方法:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new ViewResult 
     { 
      ViewName = "~/Views/Shared/unauthorized.cshtml" 
     }; 
    } 
} 

UPDATE:

另外要覆蓋HandleUnauthorizedRequest,您可以覆蓋允許您執行自定義身份驗證的AuthorizeCore方法。

+0

我不想重定向到視圖 - 這些地址是針對程序化請求的,所以我必須將一些魔術預定義的字符串提供給響應並關閉它。所以我不想攔截Forms Auth模塊。 – sharptooth

+0

@sharptooth,如果你不想重定向到一個視圖,只需返回一個空的結果或任何客戶端的期望:'filterContext.Result = new EmptyResult();' –

+0

好吧,但我該如何調用我的自定義驗證方式? – sharptooth

0

保護您的應用程序的更簡單的方法是使用PrincipalPermissionAttribute,您可以將其應用於整個控制器,或者僅應用於控制器上的操作。例如。

[PrincipalPermission(SecurityAction.Demand, Role="Administrator")] public class AdminController : Controller { ... }

[PrincipalPermission(SecurityAction.Demand, Role="Administrator")] public ActionResult DeleteUser(int id) { ... }

你可以找到更多信息in this article

+0

如果您閱讀了評論,您會發現這確實不是一個好主意,因爲PrincipalPermssion不使用CodeSecurity。這是一個更低的水平,需要你執行一堆其他的事情。 –

相關問題