项目以前是MVC3做的,后台当时用的aspx页面。身份验证与授权用的是asp.net2.0的模式,数据库是自己的非membership数据库。
但是升级到mvc4之后,身份验证没问题。但是进行授权验证时就会访问数据库。请问哪个遇到过这种问题,如何解决?
------------------------------------------------------------------------------------------
在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: SQL Network Interfaces, error: 26 - 定位指定的服务器/实例时出错)
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
SQLExpress 数据库文件自动创建错误:
连接字符串使用应用程序 App_Data 目录中的数据库位置指定了一个本地 SQL Server Express 实例。由于提供程序确定应用程序服务数据库不存在,因此尝试自动创建该数据库。要成功检查应用程序服务数据库是否存在并自动创建应用程序服务数据库,必须 满足下列配置要求:
源错误:
执行当前 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 |
这个明显就是MVC4认为你还是在使用微软内置的验证体系。
你得贴web.config或是说明一下你是怎么修改的验证方法。
是通过修改 MemberShip.MembershipProvider还是咋弄的。
你看看MVC的验证体系相关的资料就能解决了。不就三四个东东
IPrincipal, IIdentity, MembershipProvider, Membership.ValidateUser
问题是项目不是纯粹的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>
@tomcat008: 你应该贴的是如何发现未授权用户的代码。
从这个CONFIG中看不出来。也有可能是你升级过程中不慎在哪个页面加入了Membership.ValidateUser,要不你搜索一下看是不是有哪儿出现这个方法。
“身份验证与授权用的是asp.net2.0的模式,数据库是自己的非membership数据库”,这部分是你开发的吗?或者你能描述清楚是如何实现的吗?
数据库就是普通的,有个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; } }
@tomcat008: 你这段代码不能表明你采用的是“非membership数据库”,你应该贴的是如何在未登录时跳转到登录页面。