首页 新闻 会员 周边 捐助

asp.net mvc4 身份身份问题,总是连接数据库。

0
悬赏园豆:20 [待解决问题]

项目以前是MVC3做的,后台当时用的aspx页面。身份验证与授权用的是asp.net2.0的模式,数据库是自己的非membership数据库。

但是升级到mvc4之后,身份验证没问题。但是进行授权验证时就会访问数据库。请问哪个遇到过这种问题,如何解决?

------------------------------------------------------------------------------------------

 

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: SQL Network Interfaces, error: 26 - 定位指定的服务器/实例时出错)

说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

SQLExpress 数据库文件自动创建错误:

连接字符串使用应用程序 App_Data 目录中的数据库位置指定了一个本地 SQL Server Express 实例。由于提供程序确定应用程序服务数据库不存在,因此尝试自动创建该数据库。要成功检查应用程序服务数据库是否存在并自动创建应用程序服务数据库,必须 满足下列配置要求:

  1. 如果应用程序在 Windows 7 或 Windows Server 2008 R2 上运行,则需要执行特殊配置步骤才能自动创建提供程序数据库。在以下地址提供了更多信息: http://go.microsoft.com/fwlink/?LinkId=160102。如果应用程序的 App_Data 目录尚不存在,则 Web 服务器帐户必须具有对应用程序目录的读写访问权限。这是必要的权限,因为如果不存在 App_Data 目录,Web 服务器帐户将自动创建它。
  2. 如果应用程序的 App_Data 目录已存在,则 Web 服务器帐户只要求对应用程序的 App_Data 目录具有读写访问权限。这是必要的权限,因为 Web 服务器帐户将尝试验证应用程序的 App_Data 目录中是否已存在 SQL Server Express 数据库。如果撤消 Web 服务器帐户对 App_Data 目录的读访问权限,提供程序便无法正确地确定 SQL Server Express 数据库是否已存在。如果提供程序尝试创建已存在的数据库的副本,则会出错。写访问权限也是必需的,因为创建新数据库时需要使用 Web 服务器帐户凭据。
  3. 计算机上必须安装 SQL Server Express。
  4. Web 服务器帐户的进程标识必须具有本地用户配置文件。有关如何为计算机帐户和域帐户创建本地用户配置文件的详细信息,请参见自述文档。



源错误:

执行当前 Web 请求期间生成了未经处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。


堆栈跟踪:

[SqlException (0x80131904): 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: SQL Network Interfaces, error: 26 - 定位指定的服务器/实例时出错)]
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +6749670
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +815
   System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover) +6775368
   System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) +219
   System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) +6777796
   System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) +6778255
   System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData) +878
   System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) +816
   System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions) +61
   System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) +964
   System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) +6785863
   System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) +233
   System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) +278
   System.Data.SqlClient.SqlConnection.Open() +239
   System.Web.Management.SqlServices.GetSqlConnection(String server, String user, String password, Boolean trusted, String connectionString) +102

[HttpException (0x80004005): 无法连接到 SQL Server 数据库。]
   System.Web.Management.SqlServices.GetSqlConnection(String server, String user, String password, Boolean trusted, String connectionString) +4913318
   System.Web.Management.SqlServices.SetupApplicationServices(String server, String user, String password, Boolean trusted, String connectionString, String database, String dbFileName, SqlFeatures features, Boolean install) +229
   System.Web.DataAccess.SqlConnectionHelper.CreateMdfFile(String fullFileName, String dataDir, String connectionString) +911
tomcat008的主页 tomcat008 | 初学一级 | 园豆:66
提问于:2014-10-15 04:17
< >
分享
所有回答(2)
0

这个明显就是MVC4认为你还是在使用微软内置的验证体系。

你得贴web.config或是说明一下你是怎么修改的验证方法。

是通过修改 MemberShip.MembershipProvider还是咋弄的。

你看看MVC的验证体系相关的资料就能解决了。不就三四个东东

IPrincipal, IIdentity, MembershipProvider, Membership.ValidateUser

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-10-15 08:34

问题是项目不是纯粹的mvc,后台用的webform。你说的确实是项目还是用内置的验证体系,但是不知道如何调整为以前的模式。web.config配置应该能调整这部分才是,但是却找不到解决方案。

项目里面的web.config配置如下,基本没有修改任何东西:

<configuration>
  <connectionStrings>
    <add name="WebAppEntities" connectionString="。。。。。"/>
  </connectionStrings>
  <appSettings>
    <add key="webpages:Version" value="2.0.0.0"/>
    <add key="webpages:Enabled" value="false"/>
    <add key="PreserveLoginUrl" value="true"/>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
  </appSettings>
  <!--
    有关 web.config 更改的说明,请参见 http://go.microsoft.com/fwlink/?LinkId=235367。

    可在 <httpRuntime> 标记上设置以下特性。
      <system.Web>
        <httpRuntime targetFramework="4.5.1" />
      </system.Web>
  -->
  <system.web>
    <compilation debug="true" targetFramework="4.5.1">
      <assemblies>
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      </assemblies>
    </compilation>
    
    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880"/>
    </authentication>

其他没有贴出的全是默认配置。

后台特定文件夹web.config配置:

<configuration>
    <system.web>
      <authorization>
        <allow roles="ShopUser"/>
        <deny users="*" />
      </authorization>
    </system.web>
</configuration>

支持(0) 反对(0) tomcat008 | 园豆:66 (初学一级) | 2014-10-15 09:13

@tomcat008: 你应该贴的是如何发现未授权用户的代码。

从这个CONFIG中看不出来。也有可能是你升级过程中不慎在哪个页面加入了Membership.ValidateUser,要不你搜索一下看是不是有哪儿出现这个方法。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-10-15 14:46
0

“身份验证与授权用的是asp.net2.0的模式,数据库是自己的非membership数据库”,这部分是你开发的吗?或者你能描述清楚是如何实现的吗?

Launcher | 园豆:45050 (高人七级) | 2014-10-15 10:38

数据库就是普通的,有个user表里面有帐号密码。 用户登录的时候,验证是否正确。正确的话就发身份验证票

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, user.Id.ToString(), DateTime.Now, DateTime.Now.AddDays(1), true, role.ToString());
string cookieValue = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue);
Response.Cookies.Set(cookie);
回送验证:
void application_AuthenticateRequest(object sender, EventArgs e) {
HttpApplication application = sender as HttpApplication;
HttpCookie cookie = application.Request.Cookies[FormsAuthentication.FormsCookieName];
string username = string.Empty;
string[] Roles = null;
if (cookie != null) {
string cookiestring = cookie.Value;
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookiestring);
username = ticket.Name; Roles = ticket.UserData.Split(','); //将身份验证票中的role数据转成字符串数组
System.Security.Principal.GenericIdentity identity = new System.Security.Principal.GenericIdentity(username);
System.Security.Principal.GenericPrincipal principal = new System.Security.Principal.GenericPrincipal(identity, Roles); //用户的名称和组信息
HttpContext hc = application.Context; hc.User = principal; } }

支持(0) 反对(0) tomcat008 | 园豆:66 (初学一级) | 2014-10-15 11:06

@tomcat008: 你这段代码不能表明你采用的是“非membership数据库”,你应该贴的是如何在未登录时跳转到登录页面。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-10-15 11:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册