1

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

4

2 回答 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 回答