0

在这篇文章SimpleMemberShipProvider 使用多个 PropertyValues 和自定义数据库表之后,我使用 SimpleMembershipProvider 和 WebMatrix.WebData.WebSecurity 成功创建了一个新用户。

WebSecurity.CreateUserAndAccount(model.UserName, model.Password,new { FirstName = model.FirstName,LastName = model.LastName,AppId = Guid.NewGuid(), MemberId = model.MemberId});

但是,我无法找到任何内置方法来从 MembershipProvider 或 WebSecurity 方法中检索此信息。我知道我可以直接查询数据库以获取信息并进行更新,但是我的代码将与这个测试实现紧密耦合。

任何人都知道如何从 SimpleMembershipProvider 中当前登录的用户获取扩展属性?谢谢。

4

2 回答 2

1

据我所知,您必须使用当前的 ORM 框架查询表。SimpleMembershipProvider 和 WebSecurity 允许您使用基本的东西,例如 WebSecurity.CurrentUserName、WebSecurity.UserExists、WebSecurity.GetUserId 等。

您添加到由 SimpleMembershipProvider 创建的任何表中的自定义列必须从表中手动获取。

SimpleMembershipProvider 不知道您将 FirstName 和 LastName 添加到 UserProfile(或其他表)表中。

于 2013-08-08T06:47:37.207 回答
1

SBirthare 是对的,但是,由于他没有解释如何执行此操作,请允许我(这是假设您使用您标记的 C# 服务器端语言选项,所以我相信您这样做。这也假设表名“FirstName”和“LastName”列所属的实际上是“UserProfile”):

由于 WebMatrix 带有 SQL Server-CE,我们可以为此使用一个简单的 SQL 查询。

首先设置与数据库的连接:

var db = Database.Open("Users");

接下来,编译要用于查询的适当字符串(使用简单的字符串变量):

string selectQueryString = "SELECT FirstName, LastName FROM UserProfile";

上面的字符串在传递给Query()C# 方法(如下所示)时,将IEnumerable<dynamic>返回从数据库返回的所有“FirstName”和“LastName”的列表(特别是)。如果您只希望返回某些行,您可以使用WHERESQL 字符串中的子句,因此您可以代替上面的字符串(这只是一个示例,您必须定制自己的条件以适应您的情况,但这应该给你一个简单的例子):

string selectQueryString = "SELECT FirstName, LastName FROM UserProfile WHERE Email = @0 AND UserID = @1";

如果你还不知道的话,首先让我来谈谈 the@0和 the是什么。@1它们是占位符,最终将填充您想要测试的条件(更多关于这个更进一步)使用这种方法,称为“参数化查询”,这将是您对抗 SQL 注入攻击的确凿证据。简而言之:对于在 WHERE 子句中测试的条件,始终使用这种方法(我真的不能强调这一点)。

现在,我不确定您对 SQL 查询了解多少,但它们可以非常强大和有用,并且通过使用诸如LIKE, ORDER BY, GROUP BY, JOIN, UNION, AND,OR甚至子查询之类的东西,以及许多其他关键字和方法,你真的可以让 SQL 查询按照你想要的顺序返回任何你想要的东西(一个很棒的初学者 SQL 查询教程可以在这里找到:http ://www.sqlcourse.com/index.html )。

好的,继续……一旦你按照你想要的方式编写了 selectQueryString,你只需要存储它,就像这样:

int ID = 6;
string email = "testEmailName@gmail.com";
var queryResultsList = db.Query(selectQueryString, email, ID); //Here the first argument passed to the `db.Query()` method is the query string, but each additional argument passed (and you can actually pass an array of values here instead if you want) is used to fill the `@0` and `@1` placeholders you formed in your string earlier (order is ever important here!).

并显示它,如下所示:

foreach (var row in queryResultsList)
{
    //Do something for each row returned, here!
    <div>FIRST NAME: @row.FirstName</div><br/>
    <div>LAST NAME: @row.LastName</div>
{

抱歉,如果这有很多需要考虑,但我想我至少会向您展示实现这一目标所需的所有步骤。真的没有那么多,我只是想在很长一段时间内给你一堆有用的指示:)

无论如何,如果您有任何问题或我需要澄清任何事情,请告诉我。

编辑:

好吧,我刚刚看到您使用 MVC 而不是网页。我的答案来自网页环境,但老实说,我不确定它是否会有所不同,因为我从未使用过 MVC。无论哪种方式,SQL 查询本身都应该是相同的,因为我们都使用 C#,idk。

无论哪种方式,如果我被告知此答案不适合场景或对您没有用处,我很乐意将其删除。

于 2013-08-09T19:01:00.923 回答