1

既存の Cookie に基づいてユーザーを認証しようとしています。私は過去にカスタムIIdentityIPrincipal

public class CustomIdentity : IIdentity {

    public string Name { get; set; }
    public bool IsAuthenticated { get { return true; } }
    public string AuthenticationType { get { return String.Empty; } }

}

public class CustomPrincipal : IPrincipal {

    private CustomIdentity _identity;
    private string[] _roles;

    public IIdentity Identity {
        get { return _identity; }
    }

    public CustomPrincipal(CustomIdentity identity, string[] roles) {
        _identity = identity;
        _roles = roles;
    }

    public bool IsInRole(string role) {
        return true;
        //TODO
    }
}

認証を処理するための単純な HttpModule をセットアップしました。

public class Authentication : IHttpModule {

    public void Init(HttpApplication application) {
        application.AuthenticateRequest += new EventHandler(Application_AuthenticateRequest);
    }

    private void Application_AuthenticateRequest(object sender, EventArgs e) {
        //TODO: authentication logic here
        CustomIdentity identity = new CustomIdentity();
        CustomPrincipal principal = new CustomPrincipal(identity, new string[] { });
        HttpContext.Current.User = principal;
    }

    public void Dispose() { }
}

HttpContext.Current.Request.IsAuthenticatedweb.config を介して匿名ユーザーを禁止すると、フレームワークは、認証イベントの後に true であっても、login.aspx に無限にリダイレクトされます。

これは、Windows、フォーム、およびなしの認証モードで発生します。

リクエストが適切に認証されていることをフレームワークに納得させるにはどうすればよいですか?

アップデート:

System.Web.Security.FormsAuthentication.SignOut()私の認証モジュールがプリンシパルを設定し、サインアウトが呼び出され、モジュールが再び起動するように、別の場所で呼び出していた追加のコードがあったことが判明しました。したがって、無限のリダイレクトループ。

4

4 に答える 4

1

web.config で、メンバーシップ要素の既定のプロバイダーをカスタム プロバイダーの名前に設定します。

...
<membership Default="YourDefaultProvider">
<providers>
<clear/>
<add Name="YourDefaultProvider" etc.. />
</providers>
</membership>
于 2013-11-14T17:12:56.180 に答える
0

asp.net 認証モジュールを削除しますか?

<authentication mode="None">
 ....
<modules runAllManagedModulesForAllRequests="false">
  <remove name="WindowsAuthentication" />
  <remove name="PassportAuthentication" />
  <remove name="AnonymousIdentification" />
  <remove name="FormsAuthentication" />
  ...
  <add name="myauthmodule" type="myauthmodule" />

UrlAuthorization を使用していますか?

<authorization>
  <allow roles="Admin" />
  <deny users="?" />
  <deny users="*" />
</authorization>

問題は、カスタム承認とasp.net承認の2つの世界を混在させていることが原因だと思います。

このようにしたい場合は、Cookie データを読み取ってから、asp.net が必要とすることを行う必要があります: フォーム認証 Cookie

//create ticket
var ticket = new FormsAuthenticationTicket(
        1, // ticket version
        userName,
        DateTime.Now,
        DateTime.Now.Add(timeout), // timeout
        true, // cookie persistent
        roles,
        FormsAuthentication.FormsCookiePath);

// cookie crypt
string hash = FormsAuthentication.Encrypt(ticket);

var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);
cookie.Domain = FormsAuthentication.CookieDomain;

// cookie timeout as ticket timeout
if (ticket.IsPersistent)
{
    cookie.Expires = ticket.Expiration;
}
CurrentContext.Response.Cookies.Add(cookie);
    ....
HttpContext.Current.User = new GenericPrincipal(new FormsIdentity(ticket), roles);
于 2013-11-14T16:57:34.703 に答える
0

これは単なる仮定であり、現時点では検証できませんが、空の名前で ID を設定することはできないと思います。CustomIdentity コンストラクターで設定されていません。

    CustomIdentity identity = new CustomIdentity();
    identity.Name = "foo";

これを試して理論を確認し、それが機能する場合は、カスタム認証ロジックのさらなる実装に進みます。

于 2013-11-14T17:55:39.947 に答える
0

FormsWeb.config ファイルで認証モードを に設定するとFormsAuthentication、ASP.NET が作成した Cookie に基づいて、クラスが要求の認証を担当します。

ASP.NET には認証チケットを作成するための独自の式があるため、他の Cookie は認証に合格しません。

Cookie を作成して読み取るための認証ロジックと式があるので、次の 2 つのオプションがあると思います。

  1. ASP.NET の既定の認証を無効にします (web.config を使用せず、認証メカニズムを 100% までカスタマイズするか、実際にはカスタム認証を最初から作成します)。
  2. ASP.NET 式を使用して認証 Cookie を作成します。そのためには、メソッドを使用する必要がありますFormsAuthentication.SetAuthenticationCookie
于 2013-11-14T16:59:16.803 に答える