我希望有人能够让我走上正轨,一直试图解决这个问题几个小时 我目前正在重新开发Web应用程序,我想使用MVC4属性来管理对应用程序各个部分的访问。 我遇到的问题是身份验证&权限全部由Web应用程序必须与之交互的中间件应用程序处理。
我想知道即使有这个限制我也能使用安全属性&让网络应用程序知道用户已通过身份验证。
答案 0 :(得分:1)
是的,您将能够使用现有的Authorize属性。您所要做的就是编写一个自定义Membership
和Role
提供程序,它们将使用您现有的服务,而不是依赖于默认的SQL数据库。
如果您不想经历所有这些麻烦,您还可以编写自定义授权属性(从AuthorizeAttribute
派生)并在AuthorizeCore
方法内部调用您的服务以检查当前用户有所期望的角色。
答案 1 :(得分: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
方法返回的内容相匹配。