尝试对角色进行身份验证时出现与网络相关的错误?

时间:2012-09-06 06:15:15

标签: c# asp.net-mvc forms-authentication

我觉得这很傻,但嘿,它发生了。

我使用以下方法验证我的MVC控制器:

Authorize[Roles="Admin"]

我有一个像这样的自定义标识,其中填充了正确的角色:

public class AppIdentity : IIdentity
{
    public AppIdentity(string fullName, Guid id, string[] roles)
    {
        Name = fullName;
        Id = id;
        Roles = roles;
    }

    public AppIdentity(FormsAuthenticationTicket ticket)
    {
        if (ticket == null || ticket.Name == null)
        {
            throw new ArgumentNullException("ticket");
        }

        string[] data = ticket.Name.Split(new[] { "||" }, StringSplitOptions.None);
        Name = data[0];
        Id = new Guid(data[1]);
        Roles = data[2].Split(',');
    }

    public string[] Roles { get; set; }

我在我的全球范围内进行身份验证:

    protected void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        var cookie = Request.Cookies[FormsAuthentication.FormsCookieName];
        var ticket = TryDecryptCookie(cookie);

        if (ticket != null)
        {
            var identity = new AppIdentity(ticket);
            var principal = new GenericPrincipal(identity, identity.Roles);

            Context.User = principal;
        }

这一切似乎都很好,在那里有cookie,用角色等正确创建了身份。

但是当我点击控制器时,它似乎尝试在我的appdata文件夹中创建一个数据库,错误为:

  

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

我已从web.config中删除了所有会员提供程序的内容,所以?为什么要尝试这样做?

感谢。

再多一点:

这来自AuthorizeAttribute:

IPrincipal user = httpContext.User;
        if (!user.Identity.IsAuthenticated || this._usersSplit.Length > 0 && !Enumerable.Contains<string>((IEnumerable<string>) this._usersSplit, user.Identity.Name, (IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase) || this._rolesSplit.Length > 0 && !Enumerable.Any<string>((IEnumerable<string>) this._rolesSplit, new Func<string, bool>(user.IsInRole)))
          return false;
        else
          return true;

你可以看到它询问IPrinciple是否在角色中。

在GenericPrinciple类中:

for (int index = 0; index < this.m_roles.Length; ++index)
        {
          if (this.m_roles[index] != null && string.Compare(this.m_roles[index], role, StringComparison.OrdinalIgnoreCase) == 0)
            return true;
        }

所以它真的不应该尝试连接到数据库吗?

1 个答案:

答案 0 :(得分:1)

在这里找到答案:https://stackoverflow.com/a/8568940/148998。它与web.config有关。