2013-11-20 1 views
-1

Я работаю над API, в котором у меня есть другой набор людей, у которых на их странице должен быть разный набор элементов управления, в зависимости от роли пользователя.Отображение различных элементов управления для разных групп пользователей в mvc web API

Я использую пользовательские фильтры, чтобы определить, какие пользователи будут иметь доступ к каким страницам, и я могу успешно это сделать, но проблема в том, что у меня есть три кнопки ссылок на странице мастеров, и только пользователи с ролью администратора должны иметь возможность см. все кнопки ссылок, а остальные пользователи будут иметь только кнопку выхода.

У меня есть моя главная страница следующим образом.

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <meta name="viewport" content="width=device-width" /> 
    <title>@ViewBag.Title</title> 
    @Styles.Render("~/Content/css") 
    @Scripts.Render("~/bundles/modernizr") 
</head> 
<body> 
    <header> 
     <div class="content-wrapper"> 
      <div class="float-left"> 

       <p class="site-title"> 
        <a href="~/"> 
         <img src= '@Url.Content("~/Images/logo.png")' /></a> 
       </p> 

      </div> 
      <div class="float-right"> 
       <table> 
        @if (Request.IsAuthenticated) 
        { 
         <tr>      
          <td class="btn">@Html.ActionLink(@Html.Encode(User.Identity.Name).ToUpper() + "!!", "Index", "Admin")</td> 
          <td class="btn">@Html.ActionLink("Manage Users", "Index", "System_User")</td> 
          <td class="btn">@Html.ActionLink("Sign Out", "Logout", "User")</td> 

         </tr> 
        } 
        else 
        { 
         <tr> 
          <td class="User btn"> 
           @Html.ActionLink("Sign In", "Login", "User")</td> 
         </tr> 
        } 
       </table> 
      </div> 
     </div> 
    </header> 
    <div class="container"> 

     @RenderBody() 
    </div> 
    @Scripts.Render("~/bundles/jquery") 
    @RenderSection("scripts", required: false) 
</body> 
</html> 

Пользовательских Авторизоваться класс

public class CustomAuthorizeAttribute : AuthorizeAttribute 
    { 
     public bool IsAdmin { get; set; } 

     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      using (var cn = new SqlConnection(@"Data Source=xyz.com;Initial Catalog=123$;Persist Security Info=True;User ID=abc;Password=$pqr")) 
      { 
       string _username = httpContext.User.Identity.Name; 
       string _sql = @"SELECT [IsAdmin] FROM [dbo].[System_User] " + 
         @"WHERE [Username] = @u"; 
       var cmd = new SqlCommand(_sql, cn); 
       cmd.Parameters.AddWithValue("@u", _username); 
       DataSet ds = new DataSet(); 
       SqlDataAdapter da = new SqlDataAdapter(); 
       cn.Open(); 
       da.SelectCommand = cmd; 
       da.Fill(ds); 




       if (ds.Tables[0].Rows.Count != 0) 
       { 
        string admin = ds.Tables[0].Rows[0]["IsAdmin"].ToString(); 
        if (admin == "True") 
        { 
         cmd.Dispose(); 
         IsAdmin = true; 
         return IsAdmin; 
        } 
        return false; 
       } 
       return false; 
      } 

     } 
    } 

Я попытался с помощью несколько мастера-страницы для различных точек зрения, вопрос Когда администратор посещает страницу, которая, как главная страница, что из обычного пользователя, очевидно, админ не имеют доступа к трем кнопкам ссылки, если администратор остается на этой странице.

+0

Просто добавьте IsAdmin к вашему ViewBag, и использовать его в View. Кстати, почему вы используете SQL-запросы для получения данных из базы данных? – ataravati

+0

Есть ли лучший способ получить данные из базы данных? Вы имеете в виду LINQ? – DoIt

+0

Да, сущность framework и linq. – ataravati

ответ

0

Вот ответ я понял,

@if (Request.IsAuthenticated) 
{ 
    <nav> 
     <ul class="nav"> 
      @if(ViewContext.HttpContext.User.IsInRole("Admin")) 
      { 
      <li> @Html.ActionLink(User.Identity.Name, "Admin", "Home") 
      <ul> 
       <li>@Html.ActionLink("Products", "Products", "Home")</li> 
      <li> @Html.ActionLink("Add New User", "Register", "Account", routeValues: null, htmlAttributes: new { id = "registerLink" })</li> 
       <li>@Html.ActionLink("Active Users", "ActiveUsers", "Home")</li> 

      </ul> 
       </li> 
      } 
      else{ <li> @Html.ActionLink(User.Identity.Name, "Index", "Home")</li>} 


      @*<li>@Html.ActionLink("Home", "Index", "Home")</li>*@ 
      <li>@Html.ActionLink("About", "About", "Home")</li> 
      <li>@Html.ActionLink("Contact", "Contact", "Home")</li> 
      <li> @Html.ActionLink("Change Password", "Manage", "Account", routeValues: null, htmlAttributes: new { @class = "username", title = "Manage" })</li> 
      <li> 
      @using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm" })) 
    { 
     @Html.AntiForgeryToken() 
     <a href="javascript:document.getElementById('logoutForm').submit()">Log off</a> 

    } 
       </li> 
     </ul> 
    </nav> 

} 
else 
{ 
    <ul class="nav"> 
     @*<li>@Html.ActionLink("Register", "Register", "Account", routeValues: null, htmlAttributes: new { id = "registerLink" })</li>*@ 
     <li>@Html.ActionLink("Log in", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })</li> 
    </ul> 
} 
0

Dayakar,

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

if (ExtensionMethods.IsAdmin) { 
    // include the links here 
} 

Это покажет ссылки, если метод оценивает значение true. В противном случае он не покажет ссылки.

Это неудобный способ запроса базы данных. Вместо этого я попытался бы использовать Entity Framework.

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