Мы пытаемся создать следующий сценарий:Использование WebAPI для проверки подлинности ADFS
Html страница отправляет запрос Аякса WebAPI с просьбой Wheter пользователь имеет определенную роль пользователя или нет. WebApi проверяет из ADFS, если пользователь вошел в систему (если нет, WebApi аутентифицирует пользователя). Затем WebApi считывает роли пользователей из ADFS и возвращает true/false на страницу html.
Что мы имеем до сих пор:
Ajax посылает Get-запрос на WebAPI. В WebApi у нас есть Authorize-tag, который правильно отправляет пользователя в ADFS-аутентификацию. Однако после аутентификации ADFS возвращает html-страницу, содержащую информацию saml, клиенту вместо WebApi. Итак, теперь мы создаем еще один запрос ajax (post this time), который получил html-страницу в качестве данных. Затем WebApi анализирует это и возвращает true/false на основе пользовательских ролей в SAML-ответе.
Вопросы:
В настоящее время используется механизм кажется неуклюжим. Является ли этот механизм правильным или есть лучший способ сделать это?
Если мы используем метод выше, есть ли возможность, что пользователь редактирует полученную html-страницу и дает себе роли, которых у него на самом деле нет?
- Даже если вышеуказанный механизм верен, мы все еще имеем ошибку cors, когда WebApi перенаправляется на аутентификацию. Cors включен в Startup.cs WebApi. Как мы можем избавиться от этого?
коды:
Ajax:
var uri = 'api/user';
$(document).ready(function() {
$.ajax({
url: uri,
type: "Get",
success: function (data) {
$.ajax({
url: uri,
type: "POST",
data: data,
success: function (value) {
if (value == true) {
$('#userData').text('You have correct role.');
}
else {
$('#userData').text('You don't have correct role.');
}
},
error: function (jqXHR, textStatus, err) {
window.location.href = "NotLoggedIn.html";
}
})
},
error: function (jqXHR, textStatus, err) {
window.location.href = "NotLoggedIn.html";
}
});
});
Startup.Auth.cs:
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType);
app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions
{
MetadataAddress = ConfigurationManager.AppSettings["ida:AdfsMetadataEndpoint"],
Wtrealm = ConfigurationManager.AppSettings["ida:Audience"],
});
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
});
}
UserController:
namespace SSOWebApiSample.Controllers{
[RoutePrefix("api/user")]
public class UserController : ApiController
{
[HttpGet]
[Route("")]
[Authorize]
public IHttpActionResult GetUser()
{
return Ok();
}
[HttpPost]
[Route("")]
public async Task<IHttpActionResult> PostUser()
{
bool isAdditionalInfoAllowedUser = false;
string result = await Request.Content.ReadAsStringAsync();
//Parse result here
return Ok(isAdditionalInfoAllowedUser);
}
}
}