Joh*_*his 5 asp.net-mvc forms-authentication servicestack
我有一个在api.mydomain.com上运行API的ServiceStack项目.同一解决方案中的管理项目托管在admin.mydomain.com.登录/注销已由管理应用程序处理,但我想确保在我的api调用上对用户进行身份验证(有时也检查权限).我正在跨项目使用表单身份验证,因此我的api项目可以使用auth cookie.
这是api项目中的web.config身份验证标记:
<authentication mode="Forms">
<forms protection="All" loginUrl="home/denied" slidingExpiration="true" timeout="60" defaultUrl="home/denied" path="/" domain="mydomain.com" name=".myAuth"></forms>
</authentication>
Run Code Online (Sandbox Code Playgroud)
基于此身份验证和授权帖子,我向服务方法添加了[Authenticate]属性,期望它根据IsAuthenticated的值传递/失败.但是,无论是否存在身份验证cookie,它都会每次重定向到"home/denied".(我通过继承AuthenticateAttribute并检查OriginalRequest来确认这一点...当我使用管理应用程序登录时,cookie集已经存在且req.OriginalRequest.IsAuthenticated为真.)
为什么我的请求被重定向,以及如何正确使用管理应用程序中现有的身份验证凭据?
编辑:这是我提出的解决方案.它只需要一个IPrincipal标识来通过身份验证.
public class AuthenticateAspNetAttribute : RequestFilterAttribute
{
public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto)
{
SessionFeature.AddSessionIdToRequestFilter(req, res, null); //Required to get req.GetSessionId()
using (var cache = req.GetCacheClient())
{
var sessionId = req.GetSessionId();
var session = sessionId != null ? cache.GetSession(sessionId) : null;
var originalRequest = (System.Web.HttpRequest) req.OriginalRequest;
var identity = originalRequest.RequestContext.HttpContext.User.Identity;
if (!identity.IsAuthenticated)
AuthProvider.HandleFailedAuth(new BasicAuthProvider(), session, req, res);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在您引用的身份验证和授权帖子中,内容如下:
ServiceStack 的身份验证、缓存和会话提供程序是全新的、干净的、无依赖项的可测试 API,不依赖并且没有 ASP.NET 现有的成员资格、缓存或会话提供程序模型。
这意味着它是完全独立的,与 ASP.NET 现有的身份验证提供程序无关。即客户端需要显式调用服务/auth以通过 ServiceStack Web 服务进行身份验证。
请参阅SocialBootstrapApi示例演示项目,了解 MVC 网站的示例,该网站在 MVC 控制器和 ServiceStack Web 服务之间使用和共享 ServiceStack 的身份验证提供程序。
| 归档时间: |
|
| 查看次数: |
2172 次 |
| 最近记录: |