Я внедрил систему аутентификации в 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.