.Net Core 2.2 - WsFederation - Заявка пользователя не обновляется - PullRequest
0 голосов
/ 06 ноября 2019

Я работаю над приложением .Net Core 2.2 Razor Page, которое проходит аутентификацию в ADFS 3.0 с помощью WsFederation. Это работает, и пользователь проходит проверку подлинности, и я могу получить претензии пользователя.

Я также могу получить токен обновления на основе кода авторизации с помощью ADFS 3.0. Этот краткосрочный токен обновления будет использоваться для доступа к внутреннему WebAPI. Я пытаюсь добавить новую заявку пользователя, которая будет этим токеном на предъявителя обновления. По какой-то причине после того, как я обновил список утверждений (я вижу, что он добавлен с помощью QuickWatch) и получил доступ к этому списку утверждений на другой странице, новое утверждение больше не доступно, список возвращается к тому, что было после первоначальной аутентификации.

Я повторно использую тот же код, который использовал при этом в .Net MVC5. Сейчас я читал, что в некоторых случаях может потребоваться повторный вход пользователя. Однако мне не пришлось повторно входить в систему, когда я делал это в .Net MVC5. Я немного сбит с толку, потому что я не уверен, что это проблема .Net Core, или я все это время делал неправильно в проекте MVC 5.

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

public class RefreshTokenModel : PageModel
{
    private readonly IConfiguration _config;
    private readonly IHttpContextAccessor _httpContextAccessor;


    public RefreshTokenModel(IConfiguration config, IHttpContextAccessor httpContextAccessor)
    {
        _config = config;
        _httpContextAccessor = httpContextAccessor;

    }

    public async Task<ActionResult> OnGetAsync()
    {

        //var curIdentity = (ClaimsIdentity)User.Identity;
        var curIdentity = (ClaimsIdentity)_httpContextAccessor.HttpContext.User.Identity;

        bool needToken = false;

        AuthenticationContext authenticationContext = new AuthenticationContext(_config.GetValue<string>("ADFSIdentitySettings:ADFSAuthority"), false);

        try
        {

            ClientCredential cc = new ClientCredential(_config.GetValue<string>("ADFSIdentitySettings:oAuthClient"), _config.GetValue<string>("ADFSIdentitySettings:oAuthClientSecret"));

            AuthenticationResult _authResult = await authenticationContext.AcquireTokenSilentAsync(_config.GetValue<string>("ADFSIdentitySettings:ADFSResourceIdentifier"), _config.GetValue<string>("ADFSIdentitySettings:oAuthClient"));

            if (!string.IsNullOrEmpty(_authResult.AccessToken) && !string.IsNullOrEmpty(_authResult.AccessTokenType))
            {
                //curIdentity = (ClaimsIdentity)User.Identity;
                 curIdentity = (ClaimsIdentity)_httpContextAccessor.HttpContext.User.Identity;
                var bearerToken = curIdentity.Claims.Where(x => x.Type == "BearerToken").SingleOrDefault();

                if (bearerToken != null)
                {
                    curIdentity.TryRemoveClaim(bearerToken);
                }

                curIdentity.AddClaim(new Claim("BearerToken", _authResult.CreateAuthorizationHeader()));

            }
            needToken = false;

        }
        catch (AdalException adalEx)
        {
            needToken = true;
        }

        if (needToken)
        {
            var authorizationURL = await authenticationContext.GetAuthorizationRequestUrlAsync(_config.GetValue<string>("ADFSIdentitySettings:ADFSResourceIdentifier"), _config.GetValue<string>("ADFSIdentitySettings:oAuthClient"), new Uri(_config.GetValue<string>("ADFSIdentitySettings:ADFSRedirectUri")), new UserIdentifier(User.Identity.Name, UserIdentifierType.UniqueId), "");

            return new RedirectResult(authorizationURL.AbsoluteUri);
        }
        return new PageResult();




    }
}

My Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {

            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddAuthentication(options =>
        {
            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;

        }).AddWsFederation(options =>
        {
            options.Wtrealm = "http://applicationname/razor";
            options.MetadataAddress = "urltofederationmetadata.xml";

        })
         .AddCookie();

        services.AddAuthorization();

        services.AddMvc()
            .AddRazorPagesOptions(options =>
            {

               // options.Conventions.AuthorizeFolder("/Areas/Pages/Settings"); //set authorization on just a single folder
                options.Conventions.AuthorizeFolder("/"); //- set authorization on all folders and pages
            })
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        services.AddHttpContextAccessor();
    }
...