Принудительно Azure повторная аутентификация для каждого запроса в C# - PullRequest
0 голосов
/ 29 января 2020

У меня есть требование, при котором я хочу получить код авторизации для Azure входа в систему для каждого запроса в веб-API. На данный момент, как только пользователь входит в Azure, после этого я не получаю код авторизации, так как пользователь уже вошел в систему. Как я могу заставить пользователя войти снова? Это код, который я использовал на данный момент в файле owin_startup в web API?

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
    CookieSecure = (CookieSecureOption)Convert.ToInt32(cookieSecure), //  CookieSecureOption.NeverAlways
    CookieManager = new SystemWebCookieManager(),
    CookieHttpOnly = false,
});

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
    ClientId = clientId,
    Authority = Authority,
    RedirectUri = RedirectUri,
});

1 Ответ

1 голос
/ 29 января 2020

В соответствии с кодом и делами, которые вы публикуете ранее, я думаю, что это не о Azure ad b2 c, поэтому здесь я дам ответ для azure ad.

Когда вы запросить код авторизации, есть свойство prompt=login, которое указывает , что пользователю необходимо предложить повторно подтвердить подлинность .

Также здесь есть статья о Принудительная повторная проверка подлинности с Azure AD , которые предлагают использовать Token Max Age для его достижения.

Вы можете добавить max_age = к URL авторизации (или просто поставить 0 для принудительной аутентификации по паролю в любое время). Поэтому, как только пользователь будет перенаправлен на URL, ему будет представлена ​​информация для повторного входа в систему.

public class RequireReauthenticationAttribute : Attribute, IAsyncResourceFilter
{
    private int _timeElapsedSinceLast;
    public RequireReauthenticationAttribute(int timeElapsedSinceLast)
    {
        _timeElapsedSinceLast = timeElapsedSinceLast;
    }
    public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
    {
        var foundAuthTime = int.TryParse(context.HttpContext.User.FindFirst(AppClaimTypes.AuthTime)?.Value, out int authTime);

        if (foundAuthTime && DateTime.UtcNow.ToUnixTimestamp() - authTime < _timeElapsedSinceLast)
        {
            await next();
        }
        else
        {
            var state = new Dictionary<string, string> { { "reauthenticate", "true" } };
            await context.HttpContext.Authentication.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties(state)
            {
                RedirectUri = context.HttpContext.Request.Path
            }, ChallengeBehavior.Unauthorized);
        }
    }
}
...