2016-09-30 66 views
1

试图了解如何在调用具有Authorize标头且仅重定向到视图的控制器操作时避免请求用户名和密码。如何在ASP.NET MVC中授权失败时显示自定义错误

在我的web.config我有

<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider" cacheRolesInCookie="false"> 
    <providers> 
    <clear /> 
    <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> 
    </providers> 
</roleManager> 
<authentication mode="Windows" /> 
<authorization> 
    <deny users="?" /> 
</authorization> 

然后,在我的控制,我前缀的动作如下

[Authorize(Roles = "DOMAIN\\Group")] 
    public ActionResult Index() 
    { 
     ...controller action code here 
    } 

如果我将其设置为我属于一个域\组到,那么应用程序就像预期的那样工作。如果我将其更改为虚假组进行测试,则会显示用户名和密码对话框。显然,认证永远不会发生。如果我在对话框中单击取消,我会重定向到401错误页面。

我想要做的是,因为根据定义在web.config文件中只有Windows用户可以连接,如果该Windows用户不在所选组中,只需重定向到特定的View而不是提示用户名和密码。

回答

5

您可以创建自定义属性并覆盖HandleUnauthorizedRequest。然后,您重定向到自定义页面,如果授权失败,

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
     else 
     { 
      filterContext.Result = new RedirectToRouteResult(new 
      RouteValueDictionary(new { controller = "Common", action = "AccessDenied" })); 
     } 
    } 
} 

[CustomAuthorize(Roles = "DOMAIN\\Group")] 
public ActionResult Index() 
{ 
    ... 
} 
+0

DOH !!对于.NET和C#来说相当新,我忘了所有关于自定义验证类。像魅力一样工作 –