web-dev-qa-db-ja.com

.NET MVC 5を使用した役割ベースの承認の実装

作成している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テーブルからユーザーロールを読み取るとどうなりますか?私のアプリケーションは、ユーザーがシステム上でどのような役割を持っているかをどのように知るのですか?

誰かがこれを手伝ってくれますか?

7
User987

セッションにユーザー名とロールを保存したふりをしましょう:

[AllowAnonymous]
[HttpGet]
public ActionResult Login()
{
    . . . .

    string userName = (string)Session["UserName"];
    string[] userRoles = (string[])Session["UserRoles"];

    ClaimsIdentity identity = new ClaimsIdentity(DefaultAuthenticationTypes.ApplicationCookie);

    identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userName));

    userRoles.ToList().ForEach((role) => identity.AddClaim(new Claim(ClaimTypes.Role, role)));

    identity.AddClaim(new Claim(ClaimTypes.Name, userName));

    AuthenticationManager.SignIn(identity);

    . . . .
}
7
SᴇM

役割にコントローラー(クラスレベル)またはアクション(機能レベル)へのアクセスを許可すると、役割にアクセスできます。そうでない場合、アクセスは拒否されます。

ロールまたはユーザーを指定せずにAuthorizeキーワードのみを使用すると、すべての認証済みユーザーがアクセスできます。

完全に私がそれを明確にしていることを願っていますか?

クレームベースのIDを使用するには、以下を参照してください。

https://msdn.Microsoft.com/en-gb/library/ee517291.aspx

https://msdn.Microsoft.com/en-gb/library/ff359101.aspx

これはコアにあります

ASP .NET Identity のクレームは何ですか?

1
Emil

以下に、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で上記のロールを設定する方法を見つけることができます。

0
Dawid Rutkowski