我正在使用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 - 查找服务器/实例时出错 指定)。
答案 0 :(得分:0)
我通过以下方式解决了这个问题:
出于某种原因,实际上,除了&#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部分拼写错误:
我希望我能得到帮助!