我想在我正在构建的Web应用程序中实现基于角色的授权。我想象的方法是在我的数据库中创建3个表,如下所示:
1. Roles
2. UserRoles (many to many table)
3. Users
之后,每个用户都会分配一个角色。现在......我的问题是,如何允许或禁止访问.NET MVC应用程序中的特定视图/控制器。我偶然发现了这个:
[Authorize(Roles = "HrAdmin, CanEnterPayroll")]
[HttpPost]
public ActionResult EnterPayroll(string id)
{
// . . . Enter some payroll . . .
}
Authorize属性似乎将特定控制器/操作限制为特定角色......但是,如果我从UserRoles表中读取用户角色,就像我的情况一样?我的应用程序将如何知道用户在系统中扮演什么角色?
有人可以帮我解决这个问题吗?
答案 0 :(得分:7)
让我们假设您已在会话中存储了您的用户名和角色:
@Html.TextBoxFor(m => m.CustomerName)
答案 1 :(得分:1)
如果您授权角色访问控制器(在类级别)或操作(功能级别),则角色将具有访问权限。否则访问被拒绝。
如果仅使用Authorize关键字而未指定角色或用户,则所有经过身份验证的用户都可以访问。
希望我能说清楚吗?
使用基于声明的身份参考以下
https://msdn.microsoft.com/en-gb/library/ee517291.aspx
https://msdn.microsoft.com/en-gb/library/ff359101.aspx
这是在Core
上答案 2 :(得分:0)
以下是一些代码,您可以使用Azure Active Directory实现该功能。在Startup.cs中配置应用程序:
public void ConfigureApplication(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
app.UseIISPlatformHandler();
app.UseStaticFiles();
app.UseCookieAuthentication(options =>
{
options.AutomaticAuthenticate = true;
});
app.UseOpenIdConnectAuthentication(options =>
{
options.AutomaticChallenge = true;
options.ClientId = Configuration.Get<string>("Authentication:AzureAd:ClientId");
options.Authority = Configuration.Get<string>("Authentication:AzureAd:AADInstance") + "Common";
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
RoleClaimType = "roles"
};
options.Events = new OpenIdConnectEvents
{
OnAuthenticationValidated = (context) => Task.FromResult(0),
OnAuthenticationFailed = (context) =>
{
context.Response.Redirect("/Home/Error");
context.HandleResponse(); // Suppress the exception
return Task.FromResult(0);
},
OnRemoteError = (context) => Task.FromResult(0)
};
});
app.UseMvc(routes =>
{
routes.MapRoute(name: "default", template: "{controller=Dashboard}/{action=Index}/{id?}");
});
DatabaseInitializer.InitializaDatabaseAsync(app.ApplicationServices).Wait();
}
以下是用法:
[Authorize(Roles = "SuperAdmin, Worker")]
public ActionResult Index()
{
ViewBag.Message = "Hello";
return View();
}
和:
public ActionResult Submit(FormCollection formCollection)
{
if (User.IsInRole("SuperAdmin") || User.IsInRole("Worker"))
{
...
}
if (User.IsInRole("Admin"))
{
//do some admin tasks
}
return RedirectToAction("Index", "Tasks");
}
以下是我的博文:http://www.eidias.com/blog/2016/1/16/using-azure-active-directory-application-roles。您可以在那里找到如何在AAD中配置上述角色。