使用.NET Framework 4.5创建一个将使用AngularJS的SPA应用程序。我按指令实现了System.IdentityModel以指向第三方身份验证。
Web.config编辑:
<configSections>
<section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
<section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
</configSections>
<location path="FederationMetadata">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
...
<system.web>
<authorization>
<deny users="?" />
</authorization>
<authentication mode="None" />
<compilation debug="true" targetFramework="4.5" />
<httpRuntime requestValidationType="ourcustomvalidator, ourcustomnamespace" />
<pages controlRenderingCompatibilityVersion="4.0" validateRequest="false" />
</system.web>
...
<modules runAllManagedModulesForAllRequests="true">
<remove name="FormsAuthentication" />
<add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
<add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
</modules>
...
因此,在首页启动单页应用程序时,该站点将重定向到授权站点。从那里您登录,授权并重新定向到应用程序。
现在我有一个WebAPI Restful部分作为解决方案的一部分,以及记录客户端错误以及处理我们的应用程序中的注销。这导致我遇到一些我不理解的问题:
1)如果我对我的WebApi进行/ api / logoff调用,我可以调用FederatedAuthentication.SessionAuthenticationModule.SignOut();我在幕后退出了。使用angular,我应该如何重定向用户?我注意到在发出此命令之后,如果我点击F5,我的网站会刷新,但我会自动重新登录。我希望这会回到初始页面加载的登录界面。
2)如果我对我的WebApi进行/ api /自定义调用并且我在幕后注销,我该如何捕获并重定向用户?现在我收到的错误信息是:
XMLHttpRequest cannot load https://mycustomloginurl.com/?wa=wsignin1.0&wtrealm=http%3a%2f%2flocalhost%3a561…%3dpassive%26ru%3d%252fwebapi%252fims%252ftesting&wct=2014-02-21T21%3a47%3a09Z.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:56181' is therefore not allowed access.
如果这令人困惑,我很抱歉,我试图解决所有这些问题。
答案 0 :(得分:0)
感谢更多的研究,这篇文章:Prevent XmlHttpRequest redirect response in .Net MVC WS-Federation Site帮助我找到了正确的答案。
基本上我遵循相同的代码但添加了以下内容:
resp.Clear(); // cleared the response
var fa = FederatedAuthentication.WSFederationAuthenticationModule;
var signInRequestMessage = new SignInRequestMessage(new Uri(fa.Issuer), fa.Realm);
var signInURI = signInRequestMessage.WriteQueryString();
resp.Write(signInURI);
因此我清除了响应并使响应正文包含用于身份验证的登录URL。在angular中,我有一个HTTP拦截器,它检查状态代码401,然后使用上面的数据重定向到登录。
app.config([
'$httpProvider', function($httpProvider) {
var interceptor = ['$rootScope', '$q','$window', function (scope, $q, $window) {
function success(response) {
return response;
}
function error(response) {
var status = response.status;
if (status == 401) {
$window.location.href = response.data.replace(/"/g, "");
}
// otherwise
return $q.reject(response);
}
return function (promise) {
return promise.then(success, error);
}
}];
$httpProvider.responseInterceptors.push(interceptor);
}
]);