我觉得问这个很傻,但是嘿,它正在发生。
我正在使用以下方法验证我的 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 中删除了所有 Membership 提供者的东西,所以?为什么要这样做?
谢谢。
多一点:
这是来自 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;
}
所以它真的不应该尝试连接到数据库对吗?