我创建了几个POCO然后创建了一个DbContext(FooDbContext) - 然后我从DataService<创建了一个DataService类设备。 FooDbContext> calll FooDatService。我可以在我的silverlight应用程序中访问我的所有数据,如果我启动Web浏览器,我可以按预期通过URL访问它。现在我想在成功登录后才允许DataService。
答案 0 :(得分:0)
我在3年前的博客上写过
http://netpl.blogspot.com/2010/04/aspnet-forms-authentication-sharing-for.html
我们的想法是重复使用表单cookie来保护您的调用,以便只允许登录的用户调用该服务。
答案 1 :(得分:0)
您可以向WCF服务添加服务授权管理器,以便将该服务的所有方法和端点置于访问控制之下,而无需修改任何服务实现。
创建并启动WCF服务:
Uri[] restUris = new Uri[] { new Uri(baseUri, "Api/v1/") };
// substitute your service host type here. I'm using WCF OData DataServiceHost
restAPIServiceHost = new DataServiceHost(typeof(API.RestAPIService), restUris);
var saz = restAPIServiceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
if (saz == null)
{
saz = new ServiceAuthorizationBehavior();
restAPIServiceHost.Description.Behaviors.Add(saz);
}
saz.ServiceAuthorizationManager = new MyServiceAuthorizationManager();
restAPIServiceHost.Open();
以上也可以通过web.config magic来完成。
在MyServiceAuthorizationManager实现中:
public class MyServiceAuthorizationManager: System.ServiceModel.ServiceAuthorizationManager
{
public override bool CheckAccess(OperationContext operationContext, ref Message message)
{
var reqProp = message.Properties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
var authHeader = new AuthorizationHeader(reqProp.Headers[HttpRequestHeader.Authorization]);
bool authorized = // your code to decide if caller is authorized;
if (!authorized)
{
var webContext = new WebOperationContext(operationContext);
webContext.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
// optional: give caller hints where to go to login
webContext.OutgoingResponse.Headers.Add( HttpResponseHeader.WwwAuthenticate, String.Format("Bearer realm=\"{0}\"", baseUri.AbsoluteUri));
}
return authorized;
}
}
在将请求分派给WCF实现方法之前,将为WCF服务收到的每个请求调用此CheckAccess
方法。