ASP.NET - хук аутентификации ADFS - PullRequest
0 голосов
/ 24 мая 2019

У меня есть веб-API ASP.NET, который проходит аутентификацию на сервере ADFS.Класс запуска аутентификации определен следующим образом:

public void ConfigureAuth(IAppBuilder app)

{

    app.UseCookieAuthentication(
        new CookieAuthenticationOptions
        {
        AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
        });

    app.UseWsFederationAuthentication(
        new WsFederationAuthenticationOptions
        {
            MetadataAddress = ConfigurationManager.AppSettings["ADFSMetadata"],
            Wtrealm = ConfigurationManager.AppSettings["Wtrealm"]
        });


    app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType);

}

Я хочу, чтобы при успешной аутентификации пользователя в ADFS и возвращении токена была создана запись пользователя в моей базе данных SQL, еслиэлектронная почта, найденная в заявлении, возвращенном ADFS, еще не существует в базе данных.

Существует ли какой-либо способ перехватить ответ сразу после аутентификации для выполнения вышеуказанной задачи?

1 Ответ

0 голосов
/ 27 мая 2019

Я нашел решение. Класс WsFederationAuthenticationOptions имеет свойство Notification, которое можно использовать для перехвата аутентификации и ответов об ошибках.

Например

public void ConfigureAuth(IAppBuilder app)

{

    app.UseCookieAuthentication(
        new CookieAuthenticationOptions
        {
        AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
        });

    app.UseWsFederationAuthentication(
        new WsFederationAuthenticationOptions
        {
            MetadataAddress = ConfigurationManager.AppSettings["ADFSMetadata"],
            Wtrealm = ConfigurationManager.AppSettings["Wtrealm"],
            Notifications = new WsFederationAuthenticationNotifications
            {
                AuthenticationFailed = context =>
                {
                    context.HandleResponse();
                    context.Response.Redirect("/Error?message=" + context.Exception.Message);
                    return Task.FromResult(0);
                },
                SecurityTokenReceived = context =>
                {
                    // Get the token
                    var token = context.ProtocolMessage.GetToken();                    
                    return Task.FromResult(0);
                }
            }
        });


    app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType);

}
...