如何为EF 5.0 Code First WCF DataService添加安全性

时间:2013-03-23 07:18:02

标签: c# entity-framework wcf-data-services wcf-security

我创建了几个POCO然后创建了一个DbContext(FooDbContext) - 然后我从DataService<创建了一个DataService类设备。 FooDbContext> calll FooDatService。我可以在我的silverlight应用程序中访问我的所有数据,如果我启动Web浏览器,我可以按预期通过URL访问它。现在我想在成功登录后才允许DataService。

2 个答案:

答案 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方法。