Я работаю над приложением .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();
}