在MVC5.net应用程序中请求角色时SQL Server超时

时间:2014-04-11 16:03:36

标签: c# sql-server asp.net-mvc asp.net-identity

我正在使用MVC5.NET框架和Razor View Engine在C#中开发Web应用程序。对于身份验证,我在开发时使用ASP.NET Identity(作为MVC5的标准)和SQL Server Express 2012进行数据存储。 SQL Server实例现在与应用程序在同一台计算机上运行。我正在Visual Studio 2012中开发并使用Nuget安装Identity。

我正在我的应用程序中实现角色身份验证,但出于某种神秘的原因,当应用程序达到身份验证属性(可能是Authorize属性或自定义IAuthenticationFilter)时,SQL Server超时一切都按预期工作,我可以登录,我可以请求,添加和更新数据,我可以注册一个新帐户,但每当我尝试访问角色时,SQL Server都会抛出一个HttpException说:Unable to connect to SQL Server database. < / p>

以下是我的自定义IAuthenticationFilter的代码:

public class RoleAuthenticationFilter : ActionFilterAttribute,IAuthenticationFilter
{
    public String AllowedRole { get; set; }

    public void OnAuthentication(AuthenticationContext filterContext)
    {
        if (filterContext.Principal.Identity.IsAuthenticated)
        {
            if (!filterContext.Principal.IsInRole(AllowedRole))
            {
                filterContext.Result = new HttpUnauthorizedResult();
                //throw new HttpException(403, "Unauthorized access");
            }
        }
        else
        {
            filterContext.Result = MVC.Account.Login();
            //throw new HttpException(403, "Unauthorized access");
        }
    }

    public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
    {
        filterContext.Result = MVC.Account.Login();
    }
}

我这样使用它:[RoleAuthentificationFilter(AllowedRole = "User")]

RoleAuthenticationFilter中,在调试时,我注意到IsInRole调用时抛出了异常,而不是之前。我检查了AuthenticationContext filterContext实例,发现它包含了所需的所有信息(例如当前用户所在的角色)。

我的浏览器显示以下异常:

  

发生与网络相关或特定于实例的错误   建立与SQL Server的连接。找不到服务器或   无法访问。验证实例名称是否正确   SQL Server配置为允许远程连接。 (提供者:SQL   网络接口,错误:26 - 查找服务器/实例时出错   指定)。

1 个答案:

答案 0 :(得分:0)

我通过以下方式解决了这个问题:

  • 将Asp.Net标识核心更新为2.0.1
  • 在解决方案的web.config文件中添加提供程序。

出于某种原因,实际上,除了&#34; DefaultConnection&#34;之外,用户(及其表,包括角色的表)的创建不需要任何指示。在场。

尽管如此,当您想要授权角色时,您需要为应用程序提供RoleProvider将使用的连接字符串的名称。

因此,您可能希望将以下内容添加到web.config文件(部分)。

<profile defaultProvider="DefaultProfileProvider">
  <providers>
    <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider" connectionstringname="DefaultConnection" applicationname="/">
    </add>
  </providers>
</profile>
<membership defaultProvider="DefaultMembershipProvider">
  <providers>
    <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider" connectionstringname="DefaultConnection" 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" connectionstringname="DefaultConnection" applicationname="/" /> 

  </providers>
</roleManager>

我得到了这个想法,通常是Scott Hanselman的一篇文章,但是他必须使用旧版本的ASP.net表单身份验证引擎,因为web.config部分拼写错误:

http://www.hanselman.com/blog/IntroducingSystemWebProvidersASPNETUniversalProvidersForSessionMembershipRolesAndUserProfileOnSQLCompactAndSQLAzure.aspx

我希望我能得到帮助!