web-dev-qa-db-ja.com

AuthorizeAttributeを使用したASP.NET Web API承認

新しいASP.NET Web APIベータ版を使用します。私は、ユーザーを認証するための提案された方法を機能させることができないようです。推奨されるアプローチのように思える場合、[Authorize] AP​​Iコントローラーにフィルターします。例えば:

[Authorize] 
public IEnumerable<Item> Get()
{
    return itemsService.GetItems();
}

ただし、これは意図したとおりには機能しません。リソースをリクエストすると、ログインフォームにリダイレクトされます。 RESTful webapiにはあまり適していません。

これをどのように進める必要がありますか?将来のバージョンでは異なる動作をしますか?または、独自のアクションフィルターの実装にフォールバックする必要がありますか?

59

System.Web.Http.AuthorizeAttributeではなくSystem.Web.Mvc.AuthorizeAttributeを使用していることを再確認してください。これは前に私に噛みつきました。 WebAPIチームがすべてを統合してMVCユーザーに馴染ませようとしていることは知っていますが、何かが不必要に混乱していると思います。

93
AlexGad

認証モードをNoneに設定します:

<authentication mode="None" />

なし認証なしを指定します。アプリケーションは匿名ユーザーのみを想定するか、アプリケーションが独自の認証を提供します。

http://msdn.Microsoft.com/en-us/library/532aee0e.aspx

もちろん、ヘッダーやトークンなどを介して何らかの認証を提供する必要があります。また、Windowsを指定して、ヘッダー経由で組み込みの認証を使用することもできます。

Forms設定を必要とするAPIと実際のページがこのサイトに混在している場合、独自の処理を記述する必要があります。

属性はHttpUnauthorizedResultインスタンスを返すだけで、リダイレクトは属性の外部で行われるため、問題ではなく認証プロバイダーです。

4
Paul Tyng

最後に、次の場所で解決策を見つけました: ASP.NET MVC 4 WebAPI authorization

この記事では、この問題を修正する方法を示します。

3
Malkov

フォーム認証モジュールがこれを自動的に行うため、ログインページにリダイレクトされています。その動作を取り除くには、Paulが提案したフォーム認証を無効にします。もっとRESTフレンドリーなアプローチを使用したい場合は、HTTP認証サポートの実装を検討する必要があります。このブログ投稿をご覧ください http://www.piotrwalat.net/basic-http -authentication-in-asp-net-web-api-using-membership-provider /

2
adrin

ASP.NET 5は、新しいMicrosoft.AspNet.Authorizationを保護できるシステムを導入しましたboth MVCおよびWeb APIコントローラー。

詳細については、関連する回答を参照してください。

更新:

2年前は、Microsoft.AspNetCore.Authorizationでした。

@Chris Hainesが指摘したように。現在、Microsoft.AspNetCore.Authorizationにあります。

.NETコア1.0から2.0に、多くの名前空間が移動したと思います。また、.netクラシックとコアの間の機能の広がりはあいまいでした。これが、Microsoftが.net標準を導入した理由です。

。net標準

1

また、私の答えを見てください: ASP.NET Web APIを保護する方法

便利に使用できるNuGetパッケージが作成されました。

0
Varun Chatterji

ロールを使用している場合は、スペルが正しいことを確認してください。

あなたの役割が「管理者」と呼ばれる場合、これは-例えば動作しません:

    [System.Web.Http.Authorize(Roles = "Administator")]

これも:

    [System.Web.Http.Authorize(Roles = "Administrators")]

おっとっと...

0
Simon_Weaver
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Produces("application/json")]
[Route("api/[controller]")]
public class CitiesController : Controller
{
        [HttpGet("[action]")]
        public IActionResult Get(long cityId) => Ok(Mapper.Map<City, CityDTO>(director.UnitOfWork.Cities.Get(cityId)));
}

つかいます

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

認証タイプでフィルター

0