我希望有人能够让我走上正确的轨道,现在已经尝试解决这个问题几个小时了。
我目前正在重新开发 Web 应用程序,我想使用 MVC4 属性来管理对应用程序各个部分的访问。我遇到的问题是身份验证和权限都由 Web 应用程序必须与之交互的中间件应用程序处理。
我想知道即使有这个限制,我是否能够使用安全属性并让 Web 应用程序知道用户已通过身份验证。
我希望有人能够让我走上正确的轨道,现在已经尝试解决这个问题几个小时了。
我目前正在重新开发 Web 应用程序,我想使用 MVC4 属性来管理对应用程序各个部分的访问。我遇到的问题是身份验证和权限都由 Web 应用程序必须与之交互的中间件应用程序处理。
我想知道即使有这个限制,我是否能够使用安全属性并让 Web 应用程序知道用户已通过身份验证。
是的,您将能够使用现有的 Authorize 属性。您所要做的就是编写一个自定义Membership
和Role
提供程序,它们将使用您现有的服务,而不是依赖默认的 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_AuthenticateRequest
处理授权(在每个请求上)。然后,您继续装饰您的操作方法,Authorize(Roles = "XYZ")
确保“XYZ”与您的GetUserRoles
方法返回的内容相匹配。