Silverlight Ria身份验证-在使用DomainContext之前检查身份验证

Silverlight Ria身份验证-在使用DomainContext之前检查身份验证,silverlight,authentication,ria,wcf-ria-services,Silverlight,Authentication,Ria,Wcf Ria Services,我已经开始了一个标准的Silverlight/RIA/EF应用程序,它可以像预期的那样直接工作 我想将我的整个DomainService仅限于经过身份验证的用户,因为该应用程序最终将在公共互联网上运行,并且所有数据访问都需要经过用户身份验证 我遇到的问题是,我无法在Silverlight应用程序中使用自动生成的DomainContext类,除非我将其所有加载方法封装在一个自定义类中,该自定义类在尝试检索数据之前验证用户的身份验证状态,这似乎是一项冗长乏味的编码任务 肯定有一个我错过的简单解决方案

我已经开始了一个标准的Silverlight/RIA/EF应用程序,它可以像预期的那样直接工作

我想将我的整个DomainService仅限于经过身份验证的用户,因为该应用程序最终将在公共互联网上运行,并且所有数据访问都需要经过用户身份验证

我遇到的问题是,我无法在Silverlight应用程序中使用自动生成的DomainContext类,除非我将其所有加载方法封装在一个自定义类中,该自定义类在尝试检索数据之前验证用户的身份验证状态,这似乎是一项冗长乏味的编码任务

肯定有一个我错过的简单解决方案

这在ASP.NET中很简单,因为当您丢失(或从未获得)身份验证时,您被重定向到登录页面(如web.config中配置的)


我真的很惊讶Silverlight中没有类似的机制,因为这似乎是一个标准的业务应用程序需求。

如果这是您想要的答案,如果这样做是一个好的做法,我不是100%的父辈,但您可以实现一个消息检查器,检查用户是否通过了这样的身份验证:

public class ClientCustomHeadersDispatchMessageInspector : IDispatchMessageInspector
{

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        if (!HttpContext.Current.User.Identity.IsAuthenticated) {
            throw new SecurityException("User not authenticated");
        }
        return null;
    }


    public void BeforeSendReply(ref Message reply, object correlationState)
    {
    }
}

如果这是您想要的答案,并且这样做是一种良好的做法,那么我不是100%的陛下,但是您可以实现一个消息检查器来检查用户是否通过了如下身份验证:

public class ClientCustomHeadersDispatchMessageInspector : IDispatchMessageInspector
{

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        if (!HttpContext.Current.User.Identity.IsAuthenticated) {
            throw new SecurityException("User not authenticated");
        }
        return null;
    }


    public void BeforeSendReply(ref Message reply, object correlationState)
    {
    }
}

在DomainService中要求身份验证很容易。只需向类(应用于所有操作)或要授权的操作添加[RequireAuthentication]或[RequireRole]属性。您可能会发现这些链接很有用


在域服务中要求身份验证很容易。只需向类(应用于所有操作)或要授权的操作添加[RequireAuthentication]或[RequireRole]属性。您可能会发现这些链接很有用


我认为您的思路可能是对的-我稍后会尝试一下,并报告您的想法是好的,但我没有意识到回调对象(在RIA中)包括一个可以在回调中标记为已处理的错误对象-因此避免了异常并为您提供了执行身份验证的机会。我认为您可能走上了正确的道路-稍后我会尝试并报告您的想法,但我没有意识到回调对象(在RIA中)包括一个错误对象,您可以将其标记为在回调中已处理,从而避免了异常,并为您提供了执行身份验证的机会。我的问题是,如果您尝试在未经身份验证的情况下使用[RequireAuthentication]访问服务,silverlight会崩溃,但是如果您每次都要检查身份验证状态,如何在silverlight中使用DomainContext类。您可能会发现此示例很有帮助()。它通过提示用户登录(或重定向)来处理授权错误。那里有很多有趣的东西,所以可能需要一些通读。我已经做了,很抱歉没有提到。我的问题是,如果您尝试在未经身份验证的情况下使用[RequireAuthentication]访问服务,silverlight会崩溃,但是如果您每次都要检查身份验证状态,如何在silverlight中使用DomainContext类。您可能会发现此示例很有帮助()。它通过提示用户登录(或重定向)来处理授权错误。那里有很多有趣的东西,所以可能需要一些通读。