4

私はしようとしているAngularJS + MVC + WebAPIを持っています: - MVC認証に標準(個々のアカウント)を使用します。- WebAPI ベースの認証に同じユーザーとパスワードを使用します。

問題、AngularJS からすべてが正常に動作し、Cookie 交換が行われ、Web API が値を返しますが、Postman から WebAPI にアクセスしようとすると、401 Unauthorized ではなくログオン ページにリダイレクトされます。

これを達成する最も簡単な方法は何ですか?Authorize をサブクラス化し、ロジックを手動で実装する必要がありますか?

ありがとうございました

4

3 に答える 3

7

ASP.Net 5 最新の beta8 の場合、答えは Startup.cs の ConfigureServices に次を追加することです。

         services.Configure<IdentityOptions>(config =>
        {
            options.Cookies.ApplicationCookie.LoginPath = "/Account/Login";
            options.Cookies.ApplicationCookie.CookieHttpOnly = true;
            options.Cookies.ApplicationCookie.CookieSecure = CookieSecureOption.SameAsRequest;
            options.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents()
            {
                OnRedirect = ctx =>
                {
                    if (ctx.Request.Path.StartsWithSegments("/api") &&
                    ctx.Response.StatusCode == 200)
                    {
                        ctx.Response.StatusCode = 401;
                        return Task.FromResult<object>(null);
                    }
                    else
                    {
                        ctx.Response.Redirect(ctx.RedirectUri);
                        return Task.FromResult<object>(null);
                    }
                }
            };
        });
于 2015-10-24T10:37:37.023 に答える
3

Redirect イベントにカスタム アクションを適用するだけです。ファイルでメソッドをApp_Start/Startup.Auth.cs見つけて、次のように変更します。app.UseCookieAuthentication()

public void ConfigureAuth(IAppBuilder app)
{
    // some omitted configurations 

    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        // some omitted configurations 

        Provider = new CookieAuthenticationProvider
        {
            // some omitted configurations 

            OnApplyRedirect = context => 
            {
                // assuming your API's url starts with /api
                if(!context.Request.Path.StartsWithSegments(new PathString("/api")))
                    context.Response.Redirect(context.RedirectUri);
            }
        }
    });
}
于 2015-10-21T20:38:51.850 に答える
2

RC1-Final (VS2015.1) では、次のことを行いました: Identity 構成で、AutomaticChallenge を false に設定し、ApplicationCookieAuthenticationScheme = "ApplicationCookie":

services.AddIdentity<AppUser>(options =>
        {
            // cut

            options.Cookies.ApplicationCookie.AutomaticAuthenticate = true;
            options.Cookies.ApplicationCookie.AutomaticChallenge = false;
            options.Cookies.ApplicationCookieAuthenticationScheme = "ApplicationCookie";
        })
            .AddUserStore<AppUserStore<AppUser, AppDbContext>>()
            .AddDefaultTokenProviders();

次に、ログインにリダイレクトしたいコントローラーに、 ActiveAuthenticationSchemes = "ApplicationCookie" を追加します

[Authorize(ActiveAuthenticationSchemes = "ApplicationCookie")]
    public async Task<IActionResult> Logout()
    {
        // cut
    }

しかし、他のコントローラー(私の場合はWebAPI)は、パラメーターなしのAuthorize属性でマークしました。

AutomaticChallenge のAuthenticationOptions.csインライン ヘルプから:

false の場合、認証ミドルウェアは、AuthenticationScheme によって明示的に示されている場合にのみ応答を変更します。

于 2015-12-17T10:30:11.337 に答える