4

認証がタイムアウトであるかどうかをサーバーで確認しようとしています。その後、Request.IsAuthenticated = falseユーザーをログオン ページにリダイレクトするかどうかを確認します。しかし、認証の期限が切れたとしても、それは常に私に与えられますRequest.IsAuthenticated = trueが、アプリケーションが最初に起動したときは大丈夫Request.IsAuthenticated = falseです。

プリンシパル ページがサーバーから永続的にデータを取得し、セッションがタイムアウトしないと思われるため、セッション タイムアウトを確認できません。

WebConfig で:

<code>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="1" />
    </authentication>
</code>

サーバー上:

<code>
public class CheckAuthorizeAndSessionAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpContext ctx = HttpContext.Current;

            //  check if session is supported
            if (ctx.Request.IsAuthenticated)
            {
                if (ctx.Session != null)
                {
                    // check if a new session id was generated
                    if (ctx.Session.IsNewSession)
                    {

                        // If it says it is a new session, but an existing cookie exists, then it must
                        // have timed out
                        string sessionCookie = ctx.Request.Headers["Cookie"];
                        if (null != sessionCookie)
                        {
                            FormsAuthentication.SignOut();
                            //const string loginUrl = System.Web.Security.FormsAuthentication.LoginUrl;// Url.Action("LogOn", "Account");
                            //var rr = new RedirectResult(loginUrl);
                            //filterContext.Result = rr;
                            String url = FormsAuthentication.LoginUrl;
                            filterContext.Result = new RedirectResult(url);
                        }
                    }
                }
            }
            else
            {
                ctx.Response.Redirect(@"~/Account/LogOn");
                //ctx.Response.StatusCode = 302;
            }
            base.OnActionExecuting(filterContext);
        }
    }
</code>

クライアント上

<code>
$(document).ready(function () {
        //DELETE
        $("#ModifyBlock a").live("click", function () {
            var urlForGet = '';
            var urlAction = '';
            if ($(this).attr("id") == 'Delete') {
                urlForGet = '@Url.Action("Delete", "Product")';
                urlAction = '@Url.Action("Delete", "Product", new { id = "idClient", lockType = "typeLockClient" })';
            }
            if ($(this).attr("id") == 'Edit') {
                urlForGet = '@Url.Action("Edit", "Product")';
                urlAction = '@Url.Action("Edit", "Product", new { id = "idClient", lockType = "typeLockClient" })';
            }
            if ($(this).attr("id") == 'Detail') {
                urlForGet = '@Url.Action("Detail", "Product")';
                urlAction = '@Url.Action("Detail", "Product", new { id = "idClient", lockType = "typeLockClient" })';
            }
            $.ajax({
                url: urlForGet,
                type: 'GET',
                data: { id: $(this).attr("alt"), lockType: $("#SelTypesLock").attr("value") },
                dataType: 'json',
                proccessData: false,
                contentType: 'application/json; charset=utf-8',
                statusCode: {
                    200: function (data) {
                        alert('200: Authenticated');
                    },
                    401: function (data) {
                        alert('401: Unauthenticated');
                    },
                    550: function (data) {
                        alert('550: Unauthenticated');
                        $("#ErrorMesage").text(xhr.responseText);
                    },
                    660: function (data) {
                        alert('660: Redirect to Error View');
                        window.location.href = '@Url.Action("Error", "Product")';
                    }
                },
                success: function (data) {
                    url = urlAction;
                    url = url.replace("idClient", data.Id);
                    url = url.replace("typeLockClient", $("#SelTypesLock").attr("value"));
                    window.location.href = url;
                },
                error: function (xmlHttpRequest, status, err) {
                    $("#ErrorMesage").text(xmlHttpRequest.responseText);
                }
            });
        });
    </code>`enter code here
4

1 に答える 1

1

おそらく、有効期限のスライド パラメータが true に設定されています。これが行うことは、web.config のパラメーターに対する最後の要求の時間を測定することです。

パラメータが 1 分で、30 秒間 Ajax 呼び出しを行う場合、認証が解除されることはありません。スライド有効期限をオフにしてみてください。動作するはずです

于 2012-12-24T07:22:29.147 に答える