. NET СТАНДАРТ 4.7.2 Azure Авторизация токена на предъявителя - PullRequest
2 голосов
/ 10 января 2020

У меня есть приложение. 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);
    }
}

Ответы [ 2 ]

0 голосов
/ 24 января 2020

О человек. Через несколько часов я нашел решение. Я добавил это в свой startup.auth:

            app.UseWindowsAzureActiveDirectoryBearerAuthentication(
            new WindowsAzureActiveDirectoryBearerAuthenticationOptions
            {
                Audience = "https://xxxx.onmicrosoft.com/xxxx",
                Tenant = tenantId
            });

Надеюсь, это когда-нибудь кому-нибудь поможет.

0 голосов
/ 17 января 2020

Убедитесь, что вы выставили API из вашего серверного приложения и добавили клиентское приложение.

enter image description here

Когда вы получаете токен доступа от клиента приложения, используйте api://{client_app_id}/.default в качестве области действия.

Ссылка:

Настройка приложения для предоставления веб-API

Получение токена для API

...