我们正在尝试创建以下方案:
Html页面向WebApi发送ajax请求,询问用户是否具有某些用户角色。 WebApi从ADFS检查用户是否已登录(如果没有,则WebApi对用户进行身份验证)。 WebApi然后从ADFS读取用户角色并将true / false返回到html页面。
到目前为止我们有什么:
Ajax将Get-request发送给WebApi。在WebApi中,我们有Authorize-tag,它正确地将用户发送到ADFS身份验证。但是,在身份验证之后,ADFS会将包含saml信息的html-page返回给客户端而不是WebApi。所以现在我们创建另一个ajax请求(此次发布),它已经收到html-page作为数据。 WebApi然后解析它并根据SAML响应中的用户角色返回true / false。
问题:
目前使用的机制似乎很笨重。这种机制是否正确或有更好的方法吗?
如果我们使用上述方法,是否有可能用户编辑收到的html-page并赋予自己不具备的角色?
代码:
的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);
}
}
}
答案 0 :(得分:0)
AdalJS会很好地清理它。请参阅以下内容:
要使用ADFS身份验证成功进行CORS Web API调用,我发现在Angular应用程序中调用adalAuthenticationService.init()时需要设置实例,租户,clientId和端点成员配置。有关端点示例,请参阅示例二,但将GUID替换为URL。