2016-05-11 3 views
2

У меня есть проект веб-сайта с использованием аутентификации ASp.net Identity 2. Я могу войти на сайт, зарегистрировать новых пользователей, запустить страницы приложений, созданные до сих пор, просто отлично. Но мне нужно добавить управление ролями, поэтому я могу ограничить функциональность пользователем. Это удивительно сложно сделать, пытаясь изучить его самостоятельно. Моя книга Asp.net 4.5 (ASP.NET 4.5 веб-программирование Мураха с C# 2012) говорит: «Использовать инструмент администрирования веб-сайта» Что вы, наверное, уже знаете, MS устранена. Несколько методов, которые я нашел, чтобы попытаться добраться до него, в любом случае потерпели неудачу.ASp.net Управление ролями в Identity 2.0

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

Прилагается здесь весь мой Web.config (отредактирован для обеспечения безопасности), и каков уместный код для добавления роли. В тестовом коде до сих пор будет добавлена ​​роль, а затем попытаться присвоить ее идентификатору пользователя.

Роль Кажется, создается, но я понятия не имею, где ... Это не конец таблицы [dbo]. [AspNetRoles] в моей базе данных. Я говорю, кажется, потому что, когда я снова попробую, тест, чтобы увидеть, существует ли роль в поездках и говорит, что она уже есть. if (! Roles.RoleExists (newRoleName)) { Roles.CreateRole (newRoleName); } // End create new role В базе данных проекта нет базы данных.

System.Web.Providers. по-видимому, является новым стандартным классом и «очень вероятно, что эти универсальные поставщики будут использоваться по умолчанию в следующей версии ASP.NET». Я слышу. У меня есть правильные строки подключения DB. Ясно, что все еще что-то отсутствует, и я наследую некоторый дефолт, который я просто не знаю, где-то искать ...

Любые советы и подсказки. Даже более поздняя книга.

Web.config

<?xml version="1.0" encoding="utf-8"?> 
<!-- 
    For more information on how to configure your ASP.NET application, please visit 
    http://go.microsoft.com/fwlink/?LinkId=169433 
    --> 
<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <connectionStrings> 
    <!--<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-Parts-20160425083953.mdf;Initial Catalog=aspnet-Parts-20160425083953;Integrated Security=True" providerName="System.Data.SqlClient" />--> 
    <add name="PartsDatabase" connectionString="Data Source=-redacted-;Initial Catalog=-mydatabasename-;User ID=--dbuserID--;Password=--thepassword--" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <appSettings> 
    <add key="emailServiceUserName" value="--emailuserid--" /> 
    <add key="emailServicePassword" value="--emailPW--" /> 
    </appSettings> 
    <system.web> 
    <!--<authentication mode="None" />--> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/Account/Login" timeout="60" protection="All" slidingExpiration="true"> 
     </forms> 
    </authentication> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" /> 
    <pages> 
     <namespaces> 
     <add namespace="System.Web.Optimization" /> 
     <add namespace="Microsoft.AspNet.Identity" /> 
     </namespaces> 
     <controls> 
     <add assembly="Microsoft.AspNet.Web.Optimization.WebForms" namespace="Microsoft.AspNet.Web.Optimization.WebForms" tagPrefix="webopt" /> 
     </controls> 
    </pages> 
    <membership defaultProvider="ASPNetMembershipProvider"> 
     <providers> 
     <clear /> 
     <!--<add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />--> 
     <add name="ASPNetMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="PartsDatabase" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> 
     </providers> 
    </membership> 
    <profile defaultProvider="ASPNetProfileProvider"> 
     <providers> 
     <clear /> 
     <!--<add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />--> 
     <add name="ASPNetProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="PartsDatabase" applicationName="/" /> 
     </providers> 
    </profile> 
    <roleManager defaultProvider="ASPNetRoleProvider" enabled="true"> 
     <providers> 
     <clear /> 
     <!--<add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />--> 
     <add name="ASPNetRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="PartsDatabase" applicationName="/" /> 
     </providers> 
    </roleManager> 
    <sessionState mode="InProc" customProvider="ASPNetSessionProvider"> 
     <providers> 
     <!--<add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />--> 
     <add name="ASPNetSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="PartsDatabase" /> 
     </providers> 
    </sessionState> 
    </system.web> 
    <system.webServer> 
    <modules> 
     <remove name="FormsAuthentication" /> 
    </modules> 
    </system.webServer> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" /> 
     <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="WebGrease" culture="neutral" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" /> 
     <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Microsoft.Owin" culture="neutral" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Microsoft.Owin.Security.OAuth" culture="neutral" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Microsoft.Owin.Security.Cookies" culture="neutral" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Microsoft.Owin.Security" culture="neutral" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="mssqllocaldb" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 
</configuration> 

Code-за

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.Security; 
using Microsoft.AspNet.Identity; 
using Microsoft.AspNet.Identity.Owin; 
using Owin; 
using Sperry_Parts.Models; 

namespace Parts.Account 
{ 
    public partial class ManageUsers : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
      var signinManager = Context.GetOwinContext().GetUserManager<ApplicationSignInManager>(); 

      gvUsers.DataSource = manager.Users.ToList(); 
      gvUsers.DataBind(); 
     } 

-- Code-behind for the Add Role button -- 
     protected void btnAddRole_Click(object sender, EventArgs e) 
     { 
      string newRoleName = txtRole.Text.Trim(); 
      if (!Roles.RoleExists(newRoleName)) 
      { 
       Roles.CreateRole(newRoleName); // This works once per new Role - where it Goes is anyone's guess 
      } // End create new role 


      // Check Users in Roles 
      var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
      var user = manager.FindByName("myusername"); 
      string username = user.UserName; // properly returns "myusername" 
      if (Membership.GetUser("myusername") != null) // Fails - returns Null 
       if (!Roles.IsUserInRole(user.UserName, newRoleName)) // Without the above check, this returns False, I'm not in this role... (natch) 
        Roles.AddUserToRole(user.UserName, newRoleName); // This fails, can't find the user 

     } // End Add Role 
    } 
} 

Вот это говорило, что это было только начало ... возможности редактирования не было создано еще

ответ

1

web.config настроен как старый поставщик членства ASP.Net.

Однако код представляет собой комбинацию идентификатора ASP.Net и старого поставщика членства ASP.Net.

Пожалуйста, прочтите бесплатно ASP.Net Identity at Apress от Адама Фримана.

+0

Благодарим вас за комментарий. Образцы в этом документе также MVC, я вижу. Я вообще ничего не знаю о MVC, поэтому я не уверен, какие части не применяются к веб-формам. В образце Web.config почти ничего нет, это то же самое, что и мое, которое первоначально было создано VS, когда я создал проект. Почему он вставляет противоречивую информацию об идентификаторе, которую я не знаю. Единственные биты, которые я действительно добавил, были для поставщика ролей. –

+0

ASP.Net Identity не использует модель поставщика, поэтому вы не видите в web.config. Инструмент администрирования веб-сайтов не может использоваться для ASP.Net Identity. Если вы хотите просмотреть пример кода, вы можете создать новое приложение веб-формы внутри Visual Studio 2015. Логика в значительной степени похожа на MVC Адама Фримана. – Win

+0

Ahhhhhhh ...... Смотрите, вот почему иногда использование учебников может бать вас ... Если они немного устарели, и они, конечно, этого не знают. Хорошо, мне нужно обновить MSDN, глупое дело истекло на прошлой неделе, и наше место может быть немного медленным, чтобы получить документы ... Тогда я смогу получить 2015 год и начать все заново. :-(Я надеюсь, что стандартный построенный проект включает роли. Новый веб-сайт в 2013 году специально упомянул, что он был отключен, а затем направил вас к образцу MVC, чтобы узнать, как его включить. К сожалению, для меня почти бесполезно. формы и функции, которые я есть, не в состоянии перевести. –

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