2016-10-27 2 views
6

Я хотел бы реализовать авторизацию на основе ролей в своем веб-приложении, которое я создаю. То, как я представлял себе, чтобы сделать это, чтобы создать 3 таблицы в моей БД, как следующее:Реализация авторизации на основе ролей с использованием .NET MVC 5

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 . . . 
} 

Свойства Авторизоваться кажется, ограничивают конкретные контроллеры/действия для конкретных ролей ... Но что, если я читаю роли пользователей из таблицы UserRoles, как в моем случае ?? Как мое приложение будет знать, какую роль играет пользователь в системе?

Может ли кто-нибудь помочь мне с этим?

+0

Вы проверили [Идентификация ASP.NET] (https://www.asp.net/identity)? – SeM

+0

Вам нужно добавить претензии с вашими ролями в ваш метод 'Login()'. – SeM

+0

Вышеупомянутое уже реализовано в структуре Identity, встроенной в MVC5. Вам не нужно беспокоиться о создании этих таблиц самостоятельно, просто измените строку подключения по умолчанию и укажите ее на сервере. – uk2k05

ответ

7

Позволяет делать вид, вы сохранили свой UserName и роли в Сессия:

[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); 

    . . . . 
} 
+0

Отличный пример, спасибо много! :) – User987

+0

Добро пожаловать :) – SeM

+0

Я пробовал этот метод сейчас, но он говорит, что класс AuthenticationManager по какой-то причине не содержит метод SignIn:/ – User987

1

Если вы авторизуете роль для доступа к контроллеру (на уровне класса) или к действию (функциональному уровню), к роли у них будет доступ. в противном случае доступ запрещен.

Если вы используете только ключевое слово Authorize без указания ролей или пользователей, у всех пользователей, прошедших проверку подлинности, будет доступ.

Надеюсь, я полностью разъясню?

использовать претензии на основе удостоверения, обратитесь к следующему

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

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

это на Ядра

What is the claims in ASP .NET Identity

+0

Да, я тебя понимаю. Проблема здесь в том, как мне добавить роли из моей БД, чтобы приложение узнало, какую роль у пользователя есть у БД. @SeM сказал, что я могу сделать это с чем-то, называемым «Претензии» ... Правильно ли это? – User987

+0

да претензии на основе это способ пойти, я изменил свой отдых с некоторыми ссылками, которые могут вам помочь – Emil

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.

Смежные вопросы