Silverlight RIA服务 - 如何进行Windows身份验证?

5
我正在构建我的第一个Silverlight 3 + RI Services应用程序,需要一些帮助。它将部署在受控的企业内部网络中,所有客户端都是Windows系统。我从Silverlight Business Application模板开始。这是我的要求:
1. 启动应用程序时,应用程序需要识别当前登录的用户。 2. 应用程序需要访问AD中用户的其他属性,如电子邮件、全名和组成员资格。 3. 组成员资格用于在应用程序中授予某些功能。 4. “以不同用户身份登录”链接始终可用-某些机器在整个企业范围内可用,作为特定通用用户登录(通过缺少某些成员资格组进行验证)。在这种情况下,可以输入凭据并登录(冒充)到与已经登录到计算机的用户不同的用户。 5. 在服务调用中使用此用户。
我已经修改了默认的Business Application模板中的以下内容:
1. App.xaml:appsvc:WindowsAuthentication而不是默认的FormsAuthentication 2. Web.config:authentication mode="Windows"
通过这些修改,我满足了第一个要求(获取当前登录的用户)。但是,当我检查RiaContext.Current.User时,我无法访问来自AD的其他属性,例如组成员资格。我该如何实现其他要求呢?谢谢您的帮助。

你在这方面有进展了吗? - Goober
不是吧,我很惊讶竟然没有人提出解决方案。我也在silverlight.net的RIA服务论坛上问了同样的问题,但那里也没有得到任何回应! - Gus Cavalcanti
(http://forums.silverlight.net/forums/p/130101/290853.aspx#290853) - Gus Cavalcanti
你一直在关注哪些信息来源来构建你的Silverlight商业应用程序? - Goober
我一直在关注Brad Abrams的示例,它们非常棒。这个(http://blogs.msdn.com/brada/archive/2009/07/13/business-apps-example-for-silverlight-3-rtm-and-net-ria-services-july-update-part-3-authentication.aspx)特别是用RIA和Silverlight进行身份验证,但我觉得它不够深入,无法实际实现我需要的功能。你认为呢? - Goober
我一直在关注Brad Abrams的博客。不幸的是,他没有涉及如何从AD获取有关用户安全组的信息。这对我来说非常重要,因为在我的组织中,所有应用程序都依赖于组成员身份来授予适当的权限。 - Gus Cavalcanti
3个回答

4
为了实现这个,你需要编写自己的Profile Provider并修改用户类以包括这些属性,然后就可以访问它们。
请查看RIA Services概述文档的第13.3节,并告诉我是否需要帮助。
我们正在实施一个RIA Services应用程序,已编写自定义成员资格提供程序和配置文件提供程序,如果需要帮助,请告诉我。

嗨Michal! 我在做这个项目时遇到了很多麻烦。我不太明白我需要做什么?我需要使用数据库来存储用户凭据吗?我觉得我可能完全忽略了某些东西,所有的教程都非常模糊。我真的很希望能得到一些帮助和示例等。我刚刚完成了一个功能强大的RIA应用程序,但是我无法将其移到云端,因为缺少身份验证:-( - Goober
1
是的,我们也觉得有些困难。 总结一下,我们做了以下几点: 1)通过覆盖MembershipProvider类来实现会员提供者。 2)通过覆盖ProfileProvider类来实现配置文件提供者。 3)实现了角色提供程序。 4)将所有这些内容添加到Silverlight应用程序的web.config中(非常重要)。请记住,我们正在对AD进行身份验证,但不使用ASP.NET成员身份验证或配置文件提供程序。给我发电子邮件,我可以提供一些示例。 干杯 - Michal

3

以下是我如何在BusinessApplicationTemplate提供的AuthenticationService上进行黑客攻击的方法。

 [EnableClientAccess]
    public class AuthenticationService : AuthenticationBase<User> {

    protected override User  GetAuthenticatedUser(System.Security.Principal.IPrincipal principal)
    {
        User user = base.GetAuthenticatedUser(principal);
        Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
        SystemWebSectionGroup grp = (SystemWebSectionGroup)config.GetSectionGroup("system.web");
        AuthenticationSection auth = grp.Authentication;
        if (auth.Mode == AuthenticationMode.Forms)
        {
        }
        else if (auth.Mode == AuthenticationMode.Windows)
        {
            string[] a = user.Name.Split('\\');
            System.DirectoryServices.DirectoryEntry ADEntry = new System.DirectoryServices.DirectoryEntry("WinNT://" + a[0] + "/" + a[1]);
            string Name = ADEntry.Properties["FullName"].Value.ToString();
            user.Name = Name;
        }
        return user;
    }
}

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接