1

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

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

4

2 回答 2

1

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

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

于 2013-02-25T11:53:20.233 回答
1

确实。这不仅是可能的,而且非常容易。如果您可以将 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_AuthenticateRequest处理授权(在每个请求上)。然后,您继续装饰您的操作方法,Authorize(Roles = "XYZ")确保“XYZ”与您的GetUserRoles方法返回的内容相匹配。

于 2013-02-25T12:46:21.740 回答