作成している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テーブルからユーザーロールを読み取るとどうなりますか?私のアプリケーションは、ユーザーがシステム上でどのような役割を持っているかをどのように知るのですか?
誰かがこれを手伝ってくれますか?
セッションにユーザー名とロールを保存したふりをしましょう:
[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);
. . . .
}
役割にコントローラー(クラスレベル)またはアクション(機能レベル)へのアクセスを許可すると、役割にアクセスできます。そうでない場合、アクセスは拒否されます。
ロールまたはユーザーを指定せずにAuthorizeキーワードのみを使用すると、すべての認証済みユーザーがアクセスできます。
完全に私がそれを明確にしていることを願っていますか?
クレームベースのIDを使用するには、以下を参照してください。
https://msdn.Microsoft.com/en-gb/library/ee517291.aspx
https://msdn.Microsoft.com/en-gb/library/ff359101.aspx
これはコアにあります
ASP .NET Identity のクレームは何ですか?
以下に、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で上記のロールを設定する方法を見つけることができます。