2017-06-21 22 views
1

次の例に基づいて、カスタム基本認証を使用してASP.NETコアWebアプリケーションを作成しています。 ASP.NET Core Web API Authentication これで、ユーザーコントローラにアクションを登録しましたユーザー。だから、私はこのメソッドを自分のカスタム属性 "SkipAuthAttribute"に渡して、誰かがこのメソッド(アクション)を呼び出すとauthenticaion(登録したいユーザ、ログインしていない人)をスキップしなければならないと言っています。ASP.NETコアWeb APIのスキップ

しかしタイプのHttpContextは、カスタムアクション

の属性を取得するには、no ActionDescriptorは、どのように私はいくつかの特定のアクションによってauthenticaionをスキップすることができ、誰も知りませんか?

答えて

4

回答の更新: フレームワークに従ってコードを記述してください。サンプルのミドルウェアは、ASP.NET Core MVCには適していません。 - app.UseMiddleware<BasicAuthenticationMiddleware>(); Startup.csで

public class BasicAuthenticationHandler : AuthenticationHandler<BasicAuthenticationOptions> 
    { 
     protected override Task<AuthenticateResult> HandleAuthenticateAsync() 
     { 
      var authHeader = (string)this.Request.Headers["Authorization"]; 

      if (!string.IsNullOrEmpty(authHeader) && authHeader.StartsWith("basic", StringComparison.OrdinalIgnoreCase)) 
      { 
       //Extract credentials 
       string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim(); 
       Encoding encoding = Encoding.GetEncoding("iso-8859-1"); 
       string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword)); 

       int seperatorIndex = usernamePassword.IndexOf(':'); 

       var username = usernamePassword.Substring(0, seperatorIndex); 
       var password = usernamePassword.Substring(seperatorIndex + 1); 

       if (username == "test" && password == "test") 
       { 
        var user = new GenericPrincipal(new GenericIdentity("User"), null); 
        var ticket = new AuthenticationTicket(user, new AuthenticationProperties(), Options.AuthenticationScheme); 
        return Task.FromResult(AuthenticateResult.Success(ticket)); 
       } 
      } 

      return Task.FromResult(AuthenticateResult.Fail("No valid user.")); 
     } 
    } 

    public class BasicAuthenticationMiddleware : AuthenticationMiddleware<BasicAuthenticationOptions> 
    { 
     public BasicAuthenticationMiddleware(
      RequestDelegate next, 
      IOptions<BasicAuthenticationOptions> options, 
      ILoggerFactory loggerFactory, 
      UrlEncoder encoder) 
      : base(next, options, loggerFactory, encoder) 
     { 
     } 

     protected override AuthenticationHandler<BasicAuthenticationOptions> CreateHandler() 
     { 
      return new BasicAuthenticationHandler(); 
     } 
    } 

    public class BasicAuthenticationOptions : AuthenticationOptions 
    { 
     public BasicAuthenticationOptions() 
     { 
      AuthenticationScheme = "Basic"; 
      AutomaticAuthenticate = true; 
     } 
    } 

登録:ここに私の例です。

[Authorize(ActiveAuthenticationSchemes = "Basic")] 
[Route("api/[controller]")] 
public class ValuesController : Controller 

、あなたはアプリケーションレベルでフィルタを認可適用した場合、属性AllowAnonymousを使用します。このコードを使用すると、スタンダール属性Autorizeで任意のコントローラを制限することができます。

オリジナルの答え: From documentation

彼らが登録する前に、匿名ユーザーがサイトに関する情報を得ることができるホームコントローラに[AllowAnonymous]を追加します。

using Microsoft.AspNetCore.Mvc; 
using Microsoft.AspNetCore.Authorization; 

namespace ContactManager.Controllers { 
[AllowAnonymous] 
public class HomeController : Controller 
{ 
    public IActionResult Index() 
    { 
     return View(); 
    } 
+0

は、何にHomeControllerありません、私はMVCを使用していないんだけど、とは、Web APIと述べました。私の場合、基本認証はカスタムミドルウェアです(例:https://stackoverflow.com/questions/38977088/asp-net-core-web-api-authentication)。それでAllowAnonymous属性を気にしません。私は呼び出されたコントローラーの属性を読みたいと思います。 –

+0

ASP.NetコアはMVCとWeb APIで同じです。 –

+0

それは私のために働く!ありがとう!!! – Leila