Расширение MSAL для поддержки нескольких веб-API

Привет, я начал с образца здесь

https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi

И удалось заставить TaskWebApp общаться с TaskService.

Теперь я хочу расширить решение, чтобы иметь 3-й сервис

Я не уверен, что проблема в приложении ConfidentialClientApplication, поскольку, когда ему не удается получить мои токены, я не получаю никаких исключений.

Я думаю, что проблема заключается в том, что метод COnfigureApp в моем TaskWebApp ожидает управления токенами только из одного TokenService.

Вот мой метод веб-приложения Starttup.Auth ConfigureAuth, он не изменился по сравнению с примером приложения.

 public void ConfigureAuth(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions());
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                // Generate the metadata address using the tenant and policy information
                MetadataAddress = String.Format(AadInstance, Tenant, DefaultPolicy),

                // These are standard OpenID Connect parameters, with values pulled from web.config
                ClientId = ClientId,
                RedirectUri = RedirectUri,
                PostLogoutRedirectUri = RedirectUri,

                // Specify the callbacks for each type of notifications
                Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    RedirectToIdentityProvider = OnRedirectToIdentityProvider,
                    AuthorizationCodeReceived = OnAuthorizationCodeReceived,
                    AuthenticationFailed = OnAuthenticationFailed,
                },

                // Specify the claims to validate
                TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = "name"
                },

                // Specify the scope by appending all of the scopes requested into one string (seperated by a blank space)
                Scope = $"{OpenIdConnectScopes.OpenId} {ReadTasksScope} {WriteTasksScope}"
            }
        );
    }

Вот мой метод OnAuthorizationCodeReceived, снова без изменений

 private async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedNotification notification)
    {
        // Extract the code from the response notification
        var code = notification.Code;

        var userObjectId = notification.AuthenticationTicket.Identity.FindFirst(ObjectIdElement).Value;
        var authority = String.Format(
                            AadInstance, 
                            Tenant, 
                            DefaultPolicy);
        var httpContext = notification.OwinContext.Environment["System.Web.HttpContextBase"] as HttpContextBase;

        // Exchange the code for a token. Make sure to specify the necessary scopes
        ClientCredential cred = new ClientCredential(ClientSecret);
        ConfidentialClientApplication app = new ConfidentialClientApplication(
                                            authority, 
                                            Startup.ClientId,
                                            RedirectUri, 
                                            cred, 
                                            new NaiveSessionCache(userObjectId, httpContext));

        var authResult = await app.AcquireTokenByAuthorizationCodeAsync(new string[]
        {
            ReadTasksScope,
            WriteTasksScope
        }, 
        code, 
        DefaultPolicy);



    }

Проблема, похоже, заключается в том, что моя область чтения и записи напрямую ссылается на TaskService, и когда я пытаюсь запросить соответствующие области из других приложений, он жалуется.

в моем контроллере

    private async Task<String> acquireToken(String[] scope)
    {

        try
        {
            string userObjectID = ClaimsPrincipal.Current.FindFirst(Startup.ObjectIdElement).Value;
            string authority = String.Format(Startup.AadInstance, Startup.Tenant, Startup.DefaultPolicy);

            ClientCredential credential = new ClientCredential(Startup.ClientSecret);

            // Retrieve the token using the provided scopes
            ConfidentialClientApplication app = new ConfidentialClientApplication(authority, Startup.ClientId,
                Startup.RedirectUri, credential,
                new NaiveSessionCache(userObjectID, this.HttpContext));

            AuthenticationResult result = await app.AcquireTokenSilentAsync(scope);

            return result.Token;
        }
        catch (Exception e)
        {
            Debug.WriteLine(e.Message);
            throw e;
        }

Этот метод используется, но My AuthorizationResult дает сбой, и сообщение не может получить токен автоматически без внутреннего исключения.

До сих пор я пытался удалить NaiveSessionCache как необязательный, и он все еще терпит неудачу.

Чтобы обойти это, я зарегистрировал 4-й сервис, а затем заставил свои веб-сайты использовать этот единственный идентификатор клиента и секрет для управления доступом к своим ресурсам, но мне кажется, что это неправильный путь вперед.

Любая помощь будет большой спасибо


person whatisthejava    schedule 09.05.2017    source источник
comment
Эй, так что, поиграв еще немного, похоже, что это может поддерживаться, если вы не включите какие-либо области. если вы измените область в Startup.Auth, настройте приложение только для области Scope = ${OpenIdConnectScopes.OpenId}, тогда вы получите токены доступа для обеих служб, но у них нет прикрепленных областей   -  person whatisthejava    schedule 09.05.2017