Asp.net mvc MVC4试图让安全模型与我的环境配合使用

Asp.net mvc MVC4试图让安全模型与我的环境配合使用,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我希望有人能让我走上正轨,几个小时来一直在努力解决这个问题。 我目前正在重新开发一个web应用程序,我想使用MVC4属性来管理对应用程序各个部分的访问。 我遇到的问题是,身份验证和权限都由web应用程序必须与之接口的中间件应用程序处理 我想知道,即使有此限制,我是否能够使用安全属性&让web应用程序知道用户已通过身份验证。是的,您将能够使用现有的Authorize属性。您所要做的就是编写一个自定义和提供程序,它将使用您现有的服务,而不是依赖默认的SQL数据库 如果您不想经历所有这些麻烦,您还可以

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


我想知道,即使有此限制,我是否能够使用安全属性&让web应用程序知道用户已通过身份验证。

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


如果您不想经历所有这些麻烦,您还可以编写一个自定义授权属性(源自
AuthorizeAttribute
),并在
AuthorizeCore
方法中调用您的服务,检查当前用户是否具有所需的角色。

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

这些示例假定
securityService
是与中间件应用程序通信的服务,它有两种方法,
GetUser
GetUserRoles

您的登录操作方法

[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\u AuthenticateRequest
处理授权(在每次请求时)。然后继续使用
Authorize(Roles=“XYZ”)
来修饰动作方法,确保“XYZ”与
GetUserRoles
方法返回的内容匹配