2

私は最初にmvc3コードを使用しています。SecurityAttributeクラスからControllerにデータを渡すときに問題が発生しました。私は実際にメッセージを表示してログインページでユーザーをリダイレクトしたいと思います。このために、SecurityAttributeクラスのAuthorizeCoreメソッドをオーバーライドします。この方法では、セッション、Cookie、tempdate、viewbagなどをこの問題を解決するための他のソリューションに直接使用することはできません。ありがとう

protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext.Session["UserID"] == null)
        {
            //here i am unable to pass message to User/LogOn action.
            httpContext.Response.Redirect("~/User/LogOn");
           // httpContext.Session["lblMsg"] = "You are not authroize to perform this                               action.Please Login through different account";
            return false; 
        }
4

1 に答える 1

4

まず最初に、AuthorizeCoreメソッド内でリダイレクトしないでください。HandleUnauthorizedRequestこの目的のために意図された方法を使用する必要があります。LogOnアクションにエラーメッセージを渡すことに関する限り、TempDataを使用できます。

public class SecurityAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // perform the custom authorization logic here and return true or false
        // DO NOT redirect here
        return httpContext.Session["UserID"] != null;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Controller.TempData["ErrorMessage"] = "You are not authroize to perform this action.Please Login through different account";

        // calling the base method will actually throw a 401 error that the
        // forms authentication module will intercept and automatically redirect
        // you to the LogOn page that was defined in web.config
        base.HandleUnauthorizedRequest(filterContext);
    }
}

次に、ログオンアクション内で:

public ActionResult LogOn()
{
    string errorMessage = TempData["ErrorMessage"] as string;
    ...
}

または、ビュー内でアクセスする場合LogOn.cshtml

<div>@TempData["ErrorMessage"]</div>

もう1つの可能性は、TempDataを使用する代わりに、メッセージをクエリ文字列パラメーターとして渡すことです。

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    var values = new RouteValueDictionary(new
    {
        controller = "User",
        action = "LogOn",
        errormessage = "You are not authroize to perform this action.Please Login through different account"
    });
    filterContext.Result = new RedirectToRouteResult(values);
}

次に、LogOnアクションにエラーメッセージをアクションパラメータとして受け取らせることができます。

public ActionResult LogOn(string errorMessage)
{
    ...
}
于 2012-06-14T11:47:19.300 に答える