使用.NET MVC 5

时间:2016-10-27 09:45:22

标签: c# asp.net asp.net-mvc asp.net-mvc-4 roles

我想在我正在构建的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表中读取用户角色,就像我的情况一样?我的应用程序将如何知道用户在系统中扮演什么角色?

有人可以帮我解决这个问题吗?

3 个答案:

答案 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

What is the claims in ASP .NET Identity

答案 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中配置上述角色。