2017-03-17 18 views
0

アイデンティティのユーザーを管理するAccountAdminコントローラがあります。UnauthorziedリクエストがASP.Net MVCコアのAccessDenied URLにリダイレクトされないのはなぜですか?

だから私は、承認は、コントローラの先頭に次のように属性があります。

[Authorize(Roles = "Admin")] 
public class AccountAdminController : Controller 

システム全体が素晴らしい働いています。管理者の役割を持つユーザーとしてログインすると、そのページにアクセスできます。管理者の役割なしでユーザーとしてログインすると、ページにアクセスできなくなります。しかし、私の問題は、「Account/AccessDenied」ページにリダイレクトされるのではなく、「AccountAdmin/Index」URLを取得するだけで、コンテンツが拒否され、「Status Code:403; Forbidden」というメッセージが表示されますから:

app.UseStatusCodePages(); 

私のスタートアップ。私が持っているStartUp.ConfigureServicesで

私が持っているStartupConfigureで
 services.AddIdentity<AppUser, IdentityRole>(options => 
     { 
      options.Password.RequiredLength = 4; 
      options.Password.RequireNonAlphanumeric = false; 
      options.Password.RequireLowercase = false; 
      options.Password.RequireUppercase = false; 
      options.Password.RequireDigit = false; 

      options.User.AllowedUserNameCharacters = null; 
     }).AddEntityFrameworkStores<ApplicationDbContext>(); 

app.UseIdentity(); 

私はここに多くのコードを投稿していない知っているが、それはすべてのかなりまっすぐ進むものです。 CaveaotはWindows認証を使用しています。 UpperRightコーナーにDomainName \ UserNameのようなユーザーログインを表示します。 は、そして私は、など私たちはTestRole1、TestRole2でサインインすることができますでの偽装ログインの種類を、作っ

AccountControllerはこのようになります

:それはすべての認証限りかなりうまく働いて

public class AccountController : Controller 
{ 
    private SignInManager<AppUser> _signInManager; 
    private UserManager<AppUser> _userManager; 
    public AccountController(SignInManager<AppUser> signInManager, 
     UserManager<AppUser> userManager) 
    { 
     _signInManager = signInManager; 
     _userManager = userManager; 
    } 

    public IActionResult Login() 
    { 
     return View(_userManager.Users.OrderBy(u => u.UserName)); 
    } 

    [HttpPost] 
    public async Task<IActionResult> Login(string userName, bool persistant) 
    { 
     await _signInManager.SignInAsync(await _userManager.FindByNameAsync(userName), persistant); 
     return RedirectToAction("Index", "Home"); 
    } 

    public async Task<IActionResult> LogOff() 
    { 
     await _signInManager.SignOutAsync(); 
     return RedirectToAction("Login", "Account"); 
    } 

承認が行われます。 私がサインインをクリックするまで、私の実際のWindowsアカウントは私が自分自身に割り当てた役割と一致しません。 SignInManagerを経由しなければなりません:

[HttpPost] 
    public async Task<IActionResult> Login(string userName, bool persistant) 
    { 
     await _signInManager.SignInAsync(await _userManager.FindByNameAsync(userName), persistant); 
     return RedirectToAction("Index", "Home"); 
    } 

このAccessDeniedリダイレクトはどのように動作させることができますか?


アップデート1:私はこのようなフィルタ作ってみました

[MyAuthorizationFilter(Roles = "Admin")] 

public class MyAuthorizationFilter : Attribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationFilterContext context) 
    { 
     if (context.HttpContext.Response.StatusCode == 403) 
     { 
      context.HttpContext.Response.Redirect("/Access/Denied"); 
     } 
    } 
} 

しかし、今の私は、標準の承認はこれで属性置き換えるしようとすると、

「ロール」が何であるかはわかりません。 "タイプまたは名前空間のロールが見つかりませんでした。アセンブリまたは名前空間がありませんか?"

+0

私は 'options.Cookies.ApplicationCookie.AccessDeniedPath ="/Account/AccessDenied ";'それがWindows Authで動作することを知りたいのです。私はそれを疑うが、...肩をすくめる。 –

+0

それを撃つ。うまくいきませんでした。 – Sam

答えて

0

私はこれをやりたいと思っています。しかしここにそれがあります。 未処理のエラーではないため、エラー処理を行わないようにしました。 これはapp.UseStatusCodePages()で処理されます。 StartUp.Configureで。

スタートアップの下の行に表示されます。私は追加設定します。

// 400 - 599 
app.UseStatusCodePagesWithRedirects("~/Account/Status/{0}"); 

これは私が特定の状況で何をしたいかを扱うが、私は指定されていない何のためのデフォルトを残すためにリダイレクトすることができる場所です。

アカウントコントローラの[アカウント/ステータス]アクションは次のようになります。

public IActionResult Status() 
    { 
     string statusCode = HttpContext.Request.Path; 
     statusCode = statusCode.Substring(statusCode.LastIndexOf('/') + 1); 
     ViewBag.StatusCode = statusCode; 
     return View(ViewBag); 
    } 

とビューは次のようになります。

<div class="container-fluid"> 
    <div class="panel panel-danger"> 
     <div class="panel-header"> 
      <h3>StatusCode: 
       @switch ((string)ViewBag.StatusCode) 
       { 
        case "403": 
         @:Access Denied 
         <div style="margin-top:5px"><a asp-controller="Account" asp-action="Login" class="btn btn-primary">Login as a different user</a></div> 
        break; 
       default: 
         @ViewBag.StatusCode 
         break; 
       } 
      </h3> 
     </div> 
    </div> 
</div> 

私はちょうど私がいることを差し込むに到達したとき、これは私のエラー処理の方法のうち滞在したいとは異なるものです。

どこか簡単な設定が必要です。しかし、私がAuthenticatonChallenge = trueなどのように見えるこれらの解決策のどれも私のために働いていません。 これは今かなりきれいだと思います。

関連する問題