0

Facebook 接続を使用して、ASP.NET MVC アプリケーションでユーザーを認証しようとしています。facebook access_token、facebook ユーザーの電子メールを取得し、次を使用してユーザーを認証するコントローラーを作成しました。

FormsAuthentication.SetAuthCookie(loggedUserEmail, true);

このすべての後、ユーザーをメインページにリダイレクトし、そこで User.Identity.Name を取得して、ログに記録されたユーザーの名前を表示しようとします (この場合は、私が推測する電子メールになります)。残念ながら、User.Identity.Name は null です。ただし、Request.IsAuthenticatedがtrueを返すため、認証プロセスは機能しているようです...

@if (Request.IsAuthenticated) {
    <p>
        @* ###THIS LINE THROWS EXCEPTION AS User.Identity.Names IS NULL### Hello, @Html.ActionLink(User.Identity.Name, "ChangePassword", "Account", routeValues: null, htmlAttributes: new { @class = "username", title = "Change password" })!*@ 
        @Html.ActionLink("Log off", "LogOff", "Account")
    </p>
}

User.Identity.Name が開始されない理由はありますか? ありがとう、

バート

PSの代わりに

FormsAuthentication.SetAuthCookie(loggedUserEmail, true);

私も試しました

var authCookie = FormsAuthentication.GetAuthCookie(loggedUserEmail, true);
var ticket = FormsAuthentication.Decrypt(authCookie.Value);
// We want to change the expiration of our forms authentication cookie
// to match the token expiration date, but you can also use your own expiration
DateTime expiration = ticket.IssueDate.AddSeconds(facebookTokenExpirationSeconds);
var newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name,
                  ticket.IssueDate, expiration, 
                  ticket.IsPersistent, facebookName);

// Encrypt the cookie again
authCookie.Value = FormsAuthentication.Encrypt(newTicket);

// Manually set it (instead of calling FormsAuthentication.SetAuthCookie)
Response.Cookies.Add(authCookie);

しかし、何も含まれていませんUser.Identity.Names...

4

2 に答える 2

0

ページをリダイレクトした後、アクセストークンの有効期限が切れたと思います。

于 2012-06-18T17:30:25.600 に答える
0

次のリクエストが行われるまで、アイデンティティが設定されるとは思いません。過去に、サインイン ロジックを実行した後にフォーム認証チケットから作成した IPrincipal に HttpContext.Current.User を手動で設定することで、これを回避しました。

このようなもの (走行距離は異なる場合があります):

var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
var ticket = FormsAuthentication.Decrypt(authCookie.Value);
var identity = new GenericIdentity(ticket.Name);
var principal = new GenericPrincipal(identity, null);
HttpContext.Current.User = principal
于 2016-01-25T21:33:04.933 に答える