は、これを行うための様々な方法がありますが、ここで追加したヘッダを読み、ControllerContextへのアクセスがないASP.Netコアに(ビューをカスタマイズすることができ、あなたのビューで私の推薦
// For ASP.Net MVC 5 simply inherit from AuthorizationAttribute and override the methods.
public class AccessControlAttribute : Attribute, IAuthorizationFilter
{
private readonly Roles role;
public AccessControlAttribute(Roles role) {
this.role = role;
}
private Boolean AuthorizationCore(AuthorizationFilterContext context) {
var username = context.HttpContext.Request.Cookies["loginCookie_username"];
var password = context.HttpContext.Request.Cookies["loginCookie_password"];
if (role == Roles.FakeFullAccess) {
username = "FAKE";
goto final;
}
//In ASP.Net MVC 5 use Ninject for dependency injection and get the service using : [NinjectContext].GetKernel.Get<DbContext>();
DbContext db = (DbContext) context.HttpContext.RequestServices.GetService(typeof(DbContext));
if (username != null && password != null) {
var findUser = db.Set<Login>().Find(username);
if (findUser != null && findUser.Password.Equals(password) && findUser.RoleId == (int)role) {
goto final;
}
}
return false;
final: {
context.HttpContext.User.AddIdentity(new System.Security.Principal.GenericIdentity(username));
return true;
}
}
private void HandleUnauthorizedRequest(AuthorizationFilterContext context) {
context.Result = new RedirectToRouteResult(new {
area = "",
controller = "",
action = ""
});
}
public void OnAuthorization(AuthorizationFilterContext context)
{
if (AuthorizationCore(context))
{
// If using a combination of roles, you have to unmask it
if (role == Roles.FakeFullAccess) {
context.HttpContext.Request.Headers.Add("Render", "FakeAccess");
}
else if (role == Roles.Admin)
{
context.HttpContext.Request.Headers.Add("Render", "AdminAccess");
}
}
else {
HandleUnauthorizedRequest(context);
}
}
}
[Flags]
public enum Roles
{
FakeFullAccess = 0,
ReadOnly = 1,
Admin = 2,
Supervisor = 1 << 2,
AnotherRole = 1 << 3
}
ですそしてViewBag、ASP.Net MVC 5を使用した場合は、ヘッダーのトリックを使用する必要はありません)
// For ASP.Net MVC 5 use the ViewBag or ViewData
@Html.Partial(HttpContext.Request.Header["Render"])
//Assuming this renders the menu with proper functions.
は今、あなたは、テストのために偽のアクセス権を持つ完全にカスタマイズ可能な役割ベースの認証システムを持っています。
更新: 属性を消費するには、次の
[AccessControl(Role.Admin)]
public TestController: Controller {
...
}
// Dedicated for testing
[AccessControl(Role.FakeAccess)]
public PreviewController: TestCoontroller{}
を行う[AccessControl(Role.FakeAccess | Role.ReadOnly)]
のように必要な場合にも、役割を組み合わせることができますが、マスク解除方法を実装する必要があります。
もう一つの選択肢は、ログインページで、 '[AllowAnonymous]' –
@StephenMueckeとマークされている '偽の'データを生成するメソッドにリダイレクトするリンクを作成することです。ユーザーが匿名であるか、すでに認証されている場合 –
ユーザーは、ログインページに直接リダイレクトされていない限り、ログインページに直接リダイレクトされませんでした( –