Вручную вызвать поток авторизации из промежуточного программного обеспечения в MVC - PullRequest
0 голосов
/ 19 мая 2018

Я настроил oauth-авторизацию в приложении MVC aspnet core 2.Он работает должным образом, когда я использую атрибут [Authorize], но я не могу заставить его работать с моим промежуточным программным обеспечением RequestHandler.

Я попытался создать службу, которая вызывает метод context.ChallengeAsync(), но не удается, когдавызывается из промежуточного программного обеспечения (вызов никогда не перенаправляется).Если пользователь еще не вошел в систему, страница согласия никогда не отображается, и возвращается токен null.

Если пользователь уже вошел в систему, вызов возвращает токен.Служба работает, когда вызывается из контроллера (вместо использования [Authorize])

Так как мне заставить его работать?Прежде чем продолжить, я хочу убедиться, что пользователь авторизован (чтобы у меня был доступ к токену) ...

Вот соответствующие разделы кода:

Startup.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = OAuthOptionsDefaults.SchemeName;
        })
       .AddCookie() 
       .AddOAuth(OAuthOptionsDefaults.SchemeName, 
                options => { options.SaveTokens = true;  /*other options*/ });

        services.AddMvc();

        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddScoped<IOAuthService, OAuthService>();
        services.AddTransient<IRequestHandler, RequestHandler>();
    }

    public void Configure(IApplicationBuilder app, IRequestHandler requestHandler, ..)
    {

        app.UseExceptionHandler("/Home/Error");
        app.UseStaticFiles();
        app.UseAuthentication();

        app.Map(new PathString("/myapi"), appbuilder =>
        {
            appbuilder.Run(async (context) =>
            {
                await requestHandler.Handle(context, "url to an api", "an api key");
            });

        });

        app.UseMvcWithDefaultRoute();
    }
}

RequestHandler.cs

public class RequestHandler : IRequestHandler
{
    //[Authorize] doesn't work
    public async Task Handle(HttpContext context, string apiUrl, string apiKey)
    {   
        //injected IOAuthService _service;
        //tried with and without context as parameter
        var accessToken = await _service.GetAccesTokenAsync();

        //do stuff ... 
    }
}

OAuthService.cs

public class OAuthService : IOAuthService
{
    private async Task<string> GetAccesTokenAsyncHelper(HttpContext context)
    {
        var isAuthenticated = ((ClaimsIdentity)context.User.Identity)?.IsAuthenticated ?? false;
        if (!isAuthenticated)
        {
            //tried with and without setting schemename
            await context.ChallengeAsync(OAuthOptionsDefaults.SchemeName);
        }

        return await context.GetTokenAsync(OAuthOptionsDefaults.SchemeName, "access_token");
    }

    public async Task<string> GetAccesTokenAsync()
    {
        //injected IHttpContextAccessor _accessor;
        var context = _accessor.HttpContext;
        return await GetAccesTokenAsyncHelper(context);
    }

    public async Task<string> GetAccesTokenAsync(HttpContext context)
    {
        return await GetAccesTokenAsyncHelper(context);
    }
}

Редактировать : сделать вопрос короче и больше, чтобы указывать в надежде, что кто-то ответит на него.

1 Ответ

0 голосов
/ 18 января 2019

Вам нужно добавить Identity в пользовательское свойство HttpContext

context.User.AddIdentity((ClaimsIdentity) principal.Identity);

Я добавил учебное пособие здесь , объясняющее, как авторизовать HttpContext в Middleware с JWT из URL-адреса, надеюсь, что это произойдетбыть полезным:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...