OAUTH - AuthorizeEndpoint не работает с углового сайта (но от почтальона) - PullRequest
0 голосов
/ 01 октября 2019

Я внедрил систему аутентификации в ASP.NET MVC, которая включает получение токенов доступа / обновления и кода авторизации для сторонних приложений.

Вся система работает при тестировании на почтальоне, но не в веб-браузере (сугловой сайт).

Это тесты: - Я аутентифицирую пользователя (/ токен) с grant_type = паролем - Я звоню / разрешаю перенаправить пользователя с кодом авторизации (/ authorize? response_type = code & client_id = 12345 & redirect_uri =http://www.google.com)

На почтальоне эта последовательность работает нормально, но когда я запускаю ее с углового сайта, AuthorizeEndpoint (в OAuthAuthorizationServerProvider) имеет context.Request.User NULL, (который не происходит, когда я запускаю егоот Почтальона).

Еще одна странная вещь: я могу получить доступ и обновить токены с углового сайта. Он не может получить код авторизации.

Я читал, что это может быть связано с CORS, нов моем случае вызов OPTIONS (предполетный) возвращает 200 OK и завершается с ошибкой GETвызов.

ОБНОВЛЕНИЕ 1

файл запуска

public partial class Startup
{
    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

    public static string PublicClientId { get; private set; }

    public void ConfigureAuth(IAppBuilder app)
    {
        app.CreatePerOwinContext(ApplicationDbContext.Create);
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        app.UseCors(CorsOptions.AllowAll);

        app.UseCookieAuthentication(new CookieAuthenticationOptions());
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        PublicClientId = "12345";
        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/token"),
            Provider = new ApplicationOAuthProvider(PublicClientId),
            AuthorizeEndpointPath = new PathString("/authorize"),
            AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
            AllowInsecureHttp = true,
            RefreshTokenProvider = new RefreshTokenProvider(),
            AuthorizationCodeProvider = new AuthoritzationCodeProvider()
        };

        app.UseOAuthBearerTokens(OAuthOptions);
    }
}

Web api config

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}"
        );
    }
}

AuthorizeEndpoint

    public override async Task AuthorizeEndpoint(OAuthAuthorizeEndpointContext context)
    {
        if (context.Request.User != null && context.Request.User.Identity.IsAuthenticated)
        {
            var redirectUri = context.Request.Query["redirect_uri"];
            var clientId = context.Request.Query["client_id"];

            var authorizeCodeContext = new AuthenticationTokenCreateContext(
                context.OwinContext,
                context.Options.AuthorizationCodeFormat,
                new AuthenticationTicket(
                    (ClaimsIdentity)context.Request.User.Identity,
                    new AuthenticationProperties(new Dictionary<string, string>
                    {
                        {"client_id", clientId},
                    })
                    {
                        RedirectUri = redirectUri,
                        IssuedUtc = DateTimeOffset.UtcNow,
                        ExpiresUtc = DateTimeOffset.UtcNow.Add(context.Options.AuthorizationCodeExpireTimeSpan)
                    }));

            context.Options.AuthorizationCodeProvider.Create(authorizeCodeContext);

            var cookies = context.Request.Cookies.ToList();
            foreach (var c in cookies)
            {
                context.Response.Cookies.Delete(c.Key, new CookieOptions());
            }

            context.Response.Redirect(redirectUri + "?code=" + Uri.EscapeDataString(authorizeCodeContext.Token));
        }
        else
        {
            context.Response.Redirect("/account/login?returnUrl=" + Uri.EscapeDataString(context.Request.Uri.ToString()));
        }
        context.RequestCompleted();
    }

ОБНОВЛЕНИЕ 2

Когда я пытаюсь получить код авторизации от почтальона (вызов "/ authorize") В context.request доступен cookie (таким образом, пользовательзалогинился). Такой же вызов из углового кода oc #, cookie - нет.

Не уверен, что проблема в CORS или в настройке OAuthAuthorizationServerOptions.

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