none
Asp.Net Mvc Rol Sorunu RRS feed

  • Soru

  • Merhaba,

    Oluşturduğum projede giriş yaparak admin ise admin butonu görünür hale gelicek onun için şöyle bi kod yazdım

    @if (Request.IsAuthenticated && User.IsInRole(Constants.AdminRoleName))
                 {
                     <li><a href="@Url.Action("Index", "Admin", new { area="Admin" })">Admin</a></li>                 
                 } 

    Ama burada User.IsInRole false geliyor. Veritabanımda User, Role ve UserRoles tablosunda kullanıcı tanımlarım mevcut. Web.config dosyasıda şu şekilde.:

    <profile defaultProvider="DefaultProfileProvider">
          <providers>
            <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="ProjeConnection" applicationName="/" />
          </providers>
        </profile>
        <membership defaultProvider="DefaultMembershipProvider">
          <providers>
            <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="ProjeConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
          </providers>
        </membership>
        <roleManager defaultProvider="DefaultRoleProvider">
          <providers>
            <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="ProjeConnection" applicationName="/" />
          </providers>
        </roleManager>
        <sessionState mode="InProc" customProvider="DefaultSessionProvider">
          <providers>
            <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="ProjeConnection" />
          </providers>
        </sessionState>

    Default rol sağlayıcıyı kullanmak istiyorum ama tahminimce benim Role ve UserRoles tablolarımı görmüyor, bunun için kendim mi bir rol saglayıcı yazmalımıyım ya da default rol saglayıcı için nasıl bi ayar yapabilir?

    Teşekkürler.

    28 Kasım 2013 Perşembe 15:43

Yanıtlar

  • Arkadaşlar sorunumu şu şekilde çözdüm. Web.Config içinde roleprovider tarzı tanımlamalara ihtiyacımız yok çünkü simplemembership ya da webmatrix tarzı bir package kullanmıyoruz.  Giriş yaptıktan sonra role atamasının gerçekleşmesi için kendimiz AuthenticationModule yazmamız gerekiyor. App_Start klasörünün altına bir class oluşturdum ve aşağıdaki kodu kopyaladım.

    [assembly: WebActivator.PreApplicationStartMethod(typeof(AuthenticationModule), "Start")] namespace Deneme.App_Start { public class AuthenticationModule : IHttpModule { public void Init(HttpApplication context) { context.AuthenticateRequest += OnAuthenticateRequest; } public void Dispose() { } public static void Start() { DynamicModuleUtility.RegisterModule(typeof(AuthenticationModule)); } private void OnAuthenticateRequest(object sender, EventArgs e) { var context = HttpContext.Current; var request = HttpContext.Current.Request; if (request.IsAuthenticated) { HttpCookie authCookie = request.Cookies[FormsAuthentication.FormsCookieName]; if (authCookie != null) { FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); var roles = authTicket.UserData.Split('|'); var user = new GenericPrincipal(context.User.Identity, roles); context.User = Thread.CurrentPrincipal = user; } } } } }

    http://nugetgallery.codeplex.com/
    • Düzenleyen Berdann 30 Kasım 2013 Cumartesi 14:56
    • Yanıt Olarak İşaretleyen Berdann 30 Kasım 2013 Cumartesi 14:56
    30 Kasım 2013 Cumartesi 14:55

Tüm Yanıtlar

  • Selam Burada senin sorduğuna benzer bir soru var. Cevaplanmış. Kontrol edermisin ?

    Veya aşağıdaki şekilde denermisin ?

    @if (Request.IsAuthenticated && HttpContext.Current.User.IsInRole("Administrator"))
                 {
                     <li><a href="@Url.Action("Index", "Admin", new { area="Admin" })">Admin</a></li>                 
                 } 

    29 Kasım 2013 Cuma 12:30
    Moderatör
  • Verdiğiniz linki kontrol ettim ama benim sorunum oradan biraz farklı ve aşağıdaki kodu denedim ayni sorun devam ediyor.
    29 Kasım 2013 Cuma 13:44
  • Arkadaşlar sorunumu şu şekilde çözdüm. Web.Config içinde roleprovider tarzı tanımlamalara ihtiyacımız yok çünkü simplemembership ya da webmatrix tarzı bir package kullanmıyoruz.  Giriş yaptıktan sonra role atamasının gerçekleşmesi için kendimiz AuthenticationModule yazmamız gerekiyor. App_Start klasörünün altına bir class oluşturdum ve aşağıdaki kodu kopyaladım.

    [assembly: WebActivator.PreApplicationStartMethod(typeof(AuthenticationModule), "Start")] namespace Deneme.App_Start { public class AuthenticationModule : IHttpModule { public void Init(HttpApplication context) { context.AuthenticateRequest += OnAuthenticateRequest; } public void Dispose() { } public static void Start() { DynamicModuleUtility.RegisterModule(typeof(AuthenticationModule)); } private void OnAuthenticateRequest(object sender, EventArgs e) { var context = HttpContext.Current; var request = HttpContext.Current.Request; if (request.IsAuthenticated) { HttpCookie authCookie = request.Cookies[FormsAuthentication.FormsCookieName]; if (authCookie != null) { FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); var roles = authTicket.UserData.Split('|'); var user = new GenericPrincipal(context.User.Identity, roles); context.User = Thread.CurrentPrincipal = user; } } } } }

    http://nugetgallery.codeplex.com/
    • Düzenleyen Berdann 30 Kasım 2013 Cumartesi 14:56
    • Yanıt Olarak İşaretleyen Berdann 30 Kasım 2013 Cumartesi 14:56
    30 Kasım 2013 Cumartesi 14:55