我创建了几个 POCO 然后创建了一个 DbContext (FooDbContext) - 然后我从 DataService< FooDbContext > calll FooDatService 创建了一个 DataService 类设备。我可以在我的 silverlight 应用程序中访问我的所有数据,如果我启动 Web 浏览器,我可以按预期通过 URL 访问它。现在我只想在成功登录后才允许使用 DataService。
问问题
252 次
2 回答
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 魔术来完成。
在您的 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
方法。
于 2013-04-01T22:28:55.147 回答
0
我在 3 年前写过这样的博客
http://netpl.blogspot.com/2010/04/aspnet-forms-authentication-sharing-for.html
这个想法是重用表单cookie来保护您的调用,以便只允许登录用户调用服务。
于 2013-03-23T09:27:56.193 回答