1

カスタム認証スキームを使用していますが、ユーザーが認証されていない場合は、を返しますHttpUnauthorizedResult。これにより、ユーザーはログインページにリダイレクトされます。ログインページで、認証の失敗が原因で使用されていることを検出し、ユーザーにこれを通知することは、どういうわけか可能ですか?もしそうなら、どうすればこれを行うことができますか?

「リクエストしたアクションを実行するには、xロールのユーザーとしてログインする必要があります」などとユーザーに伝えることができれば、ボーナスになります。

4

3 に答える 3

3

HTTP 401を返すのではなく、必要なメッセージを含むWebページと、ログインページに移動するためのボタンを返します。

実際には、不正な応答を送信していると思いますが、実際には、ASP.NETはそのHTTP 401応答をインターセプトし、代わりにHTTP 302(リダイレクト)をログインページに送信しています。したがって、カスタムメッセージが必要な場合は、目的のページにリダイレクトするだけです。

乾杯。

アップデート:

独自の承認フィルターを作成する場合、ユーザーが承認/認証されていない場合に何が起こるかを定義できます。

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    readonly String _customError;

    public MyAuthorizeAttribute(String customError)
    {
        _customError = customError;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        FormsAuthentication.SignOut();

        filterContext.Controller.TempData["Error"] = _customError;
        filterContext.Result = new RedirectResult("~/Account/yourErrorView");
    }
}

(未検証)

このようにして、属性を次のように使用できます。

    [MyAuthorize("You are not authorized to see this thing")]
    public ActionResult MyActionMethod()
    {
        return View();
    }

次に、ユーザーは「〜/ Account / yourErrorView」にリダイレクトされ、TempDataにカスタムエラーメッセージが表示されます。

乾杯。

于 2012-11-30T12:22:08.073 に答える
0

エラーの原因を説明する追加のパラメータを渡す方がよいと思います。たとえば、次のようになります。

/ Account / Login?error = 4

ログインアクションで、エラーが存在するかどうかを確認します。

さらに、セッション、Cookieなどのさまざまな方法でエラーメッセージを保存できます。

于 2012-11-30T13:20:35.747 に答える
0

AuthorizeFilterAttributeの代わりにActionFilterAttributeを使用して、エラー処理ページをポイントします。

public class RoleAuthorize: ActionFilterAttribute
    {

      public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
             var controller = (YourController)filterContext.Controller;

        try
                {
                    if (!controller.CheckForRoleMethod())
                    {
                        throw new System.Security.SecurityException("Not Authorized!");
                    }
                }
                catch (System.Security.SecurityException secEx)
                {
                    if (secEx != null)
                    {
                        // I use TempData for errors like these. It's just me.
                        TempData["ErrorMessage"] = secEx.Message;
                        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "ErrorHandler" }, { "action", "Error" } });
                    }
                }     

        }

      base.OnActionExecuting(filterContext);
    }

キャッシュされたユーザーが許可されているかどうかを確認するには、装飾されているそのコントローラーで別のメソッドを作成する必要があります。

public class ApplicationController : Controller
    {
     public bool CheckForRoleMethod(){
          // get formsauthentication details to retrieve credentials
          // return true if user has role else false
     }
 }
于 2012-11-30T15:39:44.683 に答える