我使用ASP.NET MVC 4 Web应用程序作为一些WCF服务的前端.所有用户登录/注销和会话控制都在后端完成.MVC应用程序应该只存储具有会话ID的单个cookie.我的客户端不允许使用表单身份验证,所有内容都必须自定义.
我在web.config中设置了以下内容:
<system.web>
...
<authentication mode="None" />
</system.web>
<system.webServer>
<modules>
...
<remove name="FormsAuthentication" />
...
</modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
我还有一个全局过滤器:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// Force all actions to request auth. Only actions marked with [AllowAnonymous] will be allowed.
filters.Add(new MyAuthorizeAttribute());
}
}
Run Code Online (Sandbox Code Playgroud)
在Global.asax中调用
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
Run Code Online (Sandbox Code Playgroud)
我用[AllowAnonymous]标记了每个不需要授权的控制器和操作.
现在我必须实现MyAuthorizeAttribute.我尝试了一些教程,但没有一个完全符合我的场景.
基本上,我必须为每个操作处理以下方案:
据我所知,我需要覆盖AuthorizeCore(检查我的cookie以查看会话是否存在且仍然有效)和HandleUnauthorizedRequest(将用户重定向到Home/Index而不是默认的Login页面).
对于重定向,我试过:
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
base.HandleUnauthorizedRequest(filterContext);
filterContext.Result = new RedirectResult("/Home/Index/NeedsLogin");
}
Run Code Online (Sandbox Code Playgroud)
这似乎处理第二个罚款的情况(我不确定那个基本呼叫,但它是否需要?).
对于第一种情况,我需要实现AuthorizeCore.我不确定,如何正确地做到这一点.我已经看到AuthorizeAttribute有一些代码用于处理缓存情况,也许还有更多隐藏的功能,我不想打破它.
对于第三种情况,我不确定MyAuthorizeAttribute是否能够处理它.AuthorizeAttribute可以捕获Action内部发生的异常,或者我必须在我的全局错误处理程序中处理SecurityFault.SessionExpired情况吗?
我已经实现了自己的角色提供程序,而我没有使用默认的角色提供程序.它的工作原理是,它可以告诉某人应该或不应该能够查看页面.
但是,它可以执行以下操作:
我还没有弄清楚如何使用Authorize属性执行此操作,我只有:
[Authorize(Roles="Admin")]
Run Code Online (Sandbox Code Playgroud)
基本上我需要根据授权的哪个部分失败重定向到不同的页面.
我已经看过它是否是web.config中的内容,但没有明显的跳出来.