在ASP.NET MVC中,可以使用Claims-based授权来实现智能的用户授权,而无需创建额外的表或数据库。
以下是一个示例解决方案:
public void ConfigureServices(IServiceCollection services)
{
// 添加身份验证服务
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
options.LoginPath = "/Account/Login";
});
// 添加授权服务
services.AddAuthorization(options =>
{
options.AddPolicy("AdminOnly", policy =>
policy.RequireClaim("Role", "Admin"));
});
services.AddControllersWithViews();
}
public class CustomAuthorizeAttribute : TypeFilterAttribute
{
public CustomAuthorizeAttribute(string role) : base(typeof(CustomAuthorizeFilter))
{
Arguments = new object[] { role };
}
}
public class CustomAuthorizeFilter : IAuthorizationFilter
{
private readonly string _role;
public CustomAuthorizeFilter(string role)
{
_role = role;
}
public void OnAuthorization(AuthorizationFilterContext context)
{
var user = context.HttpContext.User;
if (!user.Identity.IsAuthenticated || !user.HasClaim(c => c.Type == "Role" && c.Value == _role))
{
context.Result = new ForbidResult();
}
}
}
[CustomAuthorize("Admin")]
public class AdminController : Controller
{
// 只有具有 "Admin" 角色的用户才能访问这个Action
public IActionResult Index()
{
return View();
}
}
这样,只有具有 "Admin" 角色的用户才能访问AdminController中的Index方法。
注意:在实际使用中,你可能需要根据你的用户和角色模型进行一些自定义的调整。此示例仅提供了一个基本的框架来实现智能用户授权。