Wir versuchen folgende Szenario zu erstellen:WebAPI Verwendung mit ADFS zu authentifizieren
HTML-Seite sendet Ajax-Request an WebAPI fragen wheter Benutzer bestimmte Benutzerrolle hat oder nicht. WebApi überprüft von ADFS, ob der Benutzer angemeldet ist (andernfalls authentifiziert WebApi den Benutzer). WebApi liest dann Benutzerrollen aus ADFS und gibt die True/False-HTML-Seite zurück.
Was wir bisher haben:
Ajax sendet Get-Anfrage an WebAPI. In WebApi haben wir das Authorize-Tag, das den Benutzer korrekt an die ADFS-Authentifizierung sendet. Nach der Authentifizierung gibt ADFS jedoch eine HTML-Seite zurück, die SAML-Informationen anstelle von WebApi an den Client enthält. So, jetzt erstellen wir eine weitere Ajax-Anfrage (nach dieser Zeit), die HTML-Seite als Daten erhalten hat. WebApi analysiert dies dann und gibt basierend auf Benutzerrollen in SAML-Antwort entweder wahr/falsch zurück.
Fragen:
Derzeit verwendete Mechanismus scheint klobig. Ist dieser Mechanismus korrekt oder gibt es einen besseren Weg?
Wenn wir obige Methode verwenden, gibt es eine Möglichkeit, dass Benutzer bearbeitet HTML-Seite erhalten und gibt sich Rollen, die er nicht wirklich hat?
- Auch wenn der obige Mechanismus korrekt ist, haben wir immer noch einen Fehler, wenn WebApi zur Authentifizierung umleitet. Cors ist in WebApi's Startup.cs aktiviert. Wie werden wir das los?
Codes:
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);
}
}
}