MVC4尝试使安全模型与我的环境一起使用

时间:2013-02-25 11:51:00

标签: asp.net-mvc asp.net-mvc-4

我希望有人能够让我走上正轨,一直试图解决这个问题几个小时 我目前正在重新开发Web应用程序,我想使用MVC4属性来管理对应用程序各个部分的访问。 我遇到的问题是身份验证&权限全部由Web应用程序必须与之交互的中间件应用程序处理。

我想知道即使有这个限制我也能使用安全属性&让网络应用程序知道用户已通过身份验证。

2 个答案:

答案 0 :(得分:1)

是的,您将能够使用现有的Authorize属性。您所要做的就是编写一个自定义MembershipRole提供程序,它们将使用您现有的服务,而不是依赖于默认的SQL数据库。

如果您不想经历所有这些麻烦,您还可以编写自定义授权属性(从AuthorizeAttribute派生)并在AuthorizeCore方法内部调用您的服务以检查当前用户有所期望的角色。

答案 1 :(得分:1)

当然。它不仅可行,而且非常简单。如果您可以将ASP.NET角色视为“活动”,那么您不需要派生任何东西;你需要的一切都是内置的。

这些示例假设securityService是与您的中间件应用程序通信的服务,并且有两种方法GetUserGetUserRoles

您的登录操作方法

[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl)
{
    if (!ModelState.IsValid) return View();

    var user = securityService.GetUser(model.Username, model.Password);
    if (user == null)
    {
        ModelState.AddModelError("", "Username or password are incorrect.");
        return View();
    }

    FormsAuthentication.SetAuthCookie(user.Username, model.Remember);
    return Redirect(returnUrl);
}

在您的Global.asax.cs

protected void Application_AuthenticateRequest()
{
    if (Request.IsAuthenticated)
    {
        string username = User.Identity.Name;
        string[] roles = securityService.GetUserRoles(username);
        IIdentity identity = new GenericIdentity(username);
        Context.User = new GenericPrincipal(identity, roles);
    }
}

就是这样。 Login处理身份验证(当用户登录时),而Application_AuthenticateRequest处理授权(在每个请求上)。然后,您使用Authorize(Roles = "XYZ")继续修饰您的操作方法,确保“XYZ”与您的GetUserRoles方法返回的内容相匹配。