C# 在MVC中实现自定义身份验证时,如何终止请求处理?

C# 在MVC中实现自定义身份验证时,如何终止请求处理?,c#,.net,asp.net,asp.net-mvc,iis,C#,.net,Asp.net,Asp.net Mvc,Iis,在我的MVC2应用程序中,我希望大多数请求使用表单身份验证,而对某些特定URI的请求使用我的自定义身份验证。为此,我添加了FormsAuthentication\u OnAuthenticate()方法,并在其中检查URI,如果它是那些独占URI之一,我想检查请求头中的用户名和密码 问题是如果提供的凭据错误,如何终止请求 我试过: HttpContext context = args.Context; context.Response.Write( "Wrong credentials" );

在我的MVC2应用程序中,我希望大多数请求使用表单身份验证,而对某些特定URI的请求使用我的自定义身份验证。为此,我添加了
FormsAuthentication\u OnAuthenticate()
方法,并在其中检查URI,如果它是那些独占URI之一,我想检查请求头中的用户名和密码

问题是如果提供的凭据错误,如何终止请求

我试过:

HttpContext context = args.Context;

context.Response.Write( "Wrong credentials" );
context.Response.StatusCode = 401;
context.Response.End();
但一旦发生这种情况,请求就会被转发到web.config中指定的URI

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


我希望终止请求,以便将响应发送到客户端并关闭连接。如何实现这一点?

只要您发送401状态代码,表单身份验证模块就会截获此代码并自动重定向到登录页面。在ASP.NET MVC中处理身份验证的正确方法是使用
[Authorize]
属性。如果您不希望它重定向到登录页面,而是显示一些视图,则可以编写自定义授权属性并覆盖
HandleUnauthorizedRequest
方法:

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

更新:


除了覆盖
HandleUnauthorizedRequest
之外,您还可以覆盖允许您执行自定义身份验证的方法。

保护应用程序的更简单方法是使用
PrincipalPermissionAttribute
,您可以将其应用于整个控制器,或者仅对控制器执行操作。例如

[PrincipalPermission(SecurityAction.Demand,Role=“Administrator”)]
公共类AdminController:Controller
{
...
}

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


您可以找到更多信息。

我不想重定向到视图-这些地址用于编程请求,因此我必须向响应提供一些神奇的预定义字符串并关闭它。因此,我不希望拦截Forms Auth模块。@sharptooth,如果您不想重定向到视图,只需返回一个空结果或客户机期望的任何结果:
filterContext.result=new EmptyResult()好的,但我如何以这种方式调用自定义身份验证?@sharptooth,我不确定您所说的自定义身份验证是什么,但您始终可以覆盖此自定义属性上的
AuthorizeCore
方法,并执行您想要的任何自定义身份验证。从AuthorizeAttribute继承和覆盖
AuthorizeCore
有效。请您在回答中添加覆盖
AuthorizeCore
好吗?如果您阅读了评论,您会发现这确实不是一个好主意,因为PrincipalPermission不使用CodeSecurity。它的级别稍微低一点,需要您实现一系列其他事情。