在我的ASP.NET MVC应用程序,我想弄清楚用户是否有权访问特定的控制器,由授权数据注解如下限制
[Authorize(Roles = "user")]
我试图重写OnAuthorization以检查: -
- 如果请求被认证(这伟大工程)
- 如果用户被授权访问所请求的视图(不工作)
我的用户角色都存储在我创建了一个SessionManager对象- SessionManager.ActiveUser.Roles
下面是我在伪代码的形式,但如果有人可以帮助我得到这个权利,我会很感激。
public class HomeBaseController : Controller
{
protected override void OnAuthorization(AuthorizationContext context)
{
if (context.HttpContext.User.Identity.IsAuthenticated)
{
// these values combined are our roleName
bool isAuthorised = context.HttpContext.User.IsInRole(context.RequestContext.HttpContext.User.Identity.);
if (!context.HttpContext.User.IsInRole(---the roles associated with the requested controller action (e.g. user)---))
{
var url = new UrlHelper(context.RequestContext);
var logonUrl = url.Action("LogOn", "SSO", new { reason = "youAreAuthorisedButNotAllowedToViewThisPage" });
context.Result = new RedirectResult(logonUrl);
return;
}
}
}
至于覆盖OnAuthorization根据ProASP.NET MVC3书,他们不建议重写它,因为这种方法使用的OutputCache过滤器安全处理的内容缓存的缺省实现。
如果您正在寻找用于自定义验证(使用窗体身份验证)和授权(使用角色提供者逻辑然后在下面是我如何确保我的应用程序。
编辑:下面的逻辑使用内置的表单认证和角色管理器。 一旦用户进行身份验证和授权用户身份可以用来检查这两个认证(User.Identity.IsAuthenticated)和角色User.IsInRole(“管理员”)
在Web.Config中:
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="15" slidingExpiration="true" enableCrossAppRedirects="false" protection="All" />
</authentication>
<roleManager enabled="true" defaultProvider="MyRolesProvider" cacheRolesInCookie="true" cookieProtection="All">
<providers>
<clear />
<add name="MyRolesProvider" type="MyApp.Library.CustomRolesProvider" />
</providers>
</roleManager>
对于角色授权扩展RoleProvider,并根据需要覆盖的方法。
public class CustomRolesProvider : RoleProvider
{
public override string[] GetRolesForUser(string username)
{
// You need to return string of Roles Here which should match your role names which you plan to use.
//Some Logic to fetch roles after checking if User is Authenticated...
return new string[] { "admin" , "editor" };
}
//Rest all of them I have kept not implemented as I did not need them...
}
在你的控制器现在你可以使用这个:
[Authorize(Roles="Admin")]
public class AdminController : Controller
{
....
}
为了验证我已经实现了我的自定义身份验证检查,但我仍然使用窗体身份验证:
//This one calls by Custom Authentication to validate username/password
public ActionResult LogOn(LogOnViewModel model, string returnUrl)
{
if(Authenticate("test","test"))
{
.......
}
}
public bool Authenticate(string username, string password)
{
//Authentication Logic and Set the cookie if correct else false.
//..... your logic....
//.....
FormsAuthentication.SetAuthCookie(username, false);
}