1

私はこれを尋ねるのはばかげているように感じますが、ねえ、それは起こっています.

以下を使用して MVC コントローラーを認証しています。

Authorize[Roles="Admin"]

ロールが正しく設定された、次のようなカスタム ID があります。

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 が存在し、役割を使用して ID が正しく作成されます。

しかし、コントローラーを押すと、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;
        }

だから、DBに接続しようとするべきではありませんよね?

4

0 に答える 0