У меня есть приложение. NET MVC5 / API, которое аутентифицирует пользователей через OWIN через Azure. Прекрасно работает сам по себе. Пользователи входят в систему, используя свою учетную запись Azure AD без проблем. Мне также нужно авторизовать пользователей, прошедших аутентификацию в том же домене AD Azure, чтобы иметь доступ к этому API из других приложений. IE Клиентское приложение (с уже авторизованным пользователем Azure) -> это серверное приложение. Мой dev-клиент - это приложение Angular, использующее модуль MSAL, которое действительно передает маркеры-носители azure в своих запросах моему приложению API. NET (замечено в Fiddler). Однако ответом всегда является перенаправление на файл microsoft.login, который отображается на клиенте как ошибка CORS. Как настроить приложение. NET STANDARD для локальной авторизации пользователей через Azure, а также для приема уже авторизованных токенов на предъявителя Azure? Кроме того, разрешения для клиентских и серверных приложений были установлены в Azure (правильно, но не на 100%).
My Startup.Auth:
public partial class Startup
{
private static string redirectUrl = "Https://" + Settings.RootURL;
private static string clientId = Settings.GraphClientID;
private static string aadInstance = "https://login.microsoftonline.com/";
private static string tenantId = Settings.GraphTenantID;
private static string authority = aadInstance + tenantId;
public void ConfigureAuth(IAppBuilder app)
{
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions { CookieName = "CIM-Cookie", SlidingExpiration=true });
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
// Sets the ClientId, authority, RedirectUri as obtained from Settings.json
ClientId = clientId,
Authority = authority,
RedirectUri = redirectUrl,
UseTokenLifetime = false, //set to false to manage session with the cookie middleware
PostLogoutRedirectUri = redirectUrl,
Scope = OpenIdConnectScope.OpenIdProfile,
// ResponseType is set to request the id_token - which contains basic information about the signed-in user
ResponseType = OpenIdConnectResponseType.IdToken,
//SignInAsAuthenticationType="Cookies",
TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = false,
RoleClaimType = "groups",
NameClaimType = "name",
},
// OpenIdConnectAuthenticationNotifications configures OWIN to send notification of failed authentications to OnAuthenticationFailed method
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = OnAuthenticationFailed,
SecurityTokenValidated = (context) =>
{
var identity = context.AuthenticationTicket.Identity;
var emailClaim = identity.Claims.Where(r => r.Type == ClaimTypes.Name).FirstOrDefault();
identity.AddClaim(emailClaim);
return Task.FromResult(0);
}
}
});
}
private Task OnAuthenticationFailed(AuthenticationFailedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> context)
{
context.HandleResponse();
context.Response.Redirect("/?errormessage=" + context.Exception.Message);
return Task.FromResult(0);
}
}