ASP.NET WebApi User.Identity возвращает ноль - PullRequest
0 голосов
/ 03 декабря 2018

Итак, я пытался реализовать функцию входа через Facebook в приложении ASP.NET WebApi 2.

Но по какой-то причине, когда я пытаюсь проверить анонимные запросы:

if (!User.Identity.IsAuthenticated)
{
    return new ChallengeResult(provider, this);
}

User равно нулю.

Я уже установил режим аутентификации на None на моем web.config.

Web.config:

<system.web>
   <authentication mode="None" />
   <compilation debug="true" targetFramework="4.6.1" />
   <httpRuntime targetFramework="4.6.1" />
   <customErrors mode="Off" />
</system.web>

Кроме того, вот как я настраиваю конвейер для OAuth в моем классе Startup.cs:

public void ConfigureOAuth(IAppBuilder app) {
    app.UseExternalSignInCookie(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);
    OAuthBearerOptions = new OAuthBearerAuthenticationOptions();

    facebookAuthOptions = new FacebookAuthenticationOptions() {
         AppId = "xxxxx",
         AppSecret = "xxxxxxxxxxx",
         Provider = new FacebookAuthProvider()
    };
    app.UseFacebookAuthentication(facebookAuthOptions);
}

И вот как я получил свой контроллер:

[OverrideAuthentication]
[HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)]
[AllowAnonymous]
[Route("ExternalLogin", Name = "ExternalLogin")]
[HttpGet]
public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null) {
    string redirectUri = string.Empty;

    // HERE: User is always null.
    if (!User.Identity.IsAuthenticated) {
        return new ChallengeResult(provider, this);
    }

    // Rest of the code removed for brevity...
}

И этоВот как я настроил свой сервер разработки: enter image description here

Насколько я знаю, User.Identity должен содержать данные / утверждения, возвращенные провайдером логина, в файле cookie, ноПользователь возвращает ноль;следовательно, вызов не вызван.

1 Ответ

0 голосов
/ 11 декабря 2018

Вам необходимо установить ClaimsPrinicpal для пользователя и использовать «AuthorizeToken» в контроллере.Это в основном устанавливается, когда у вас есть токен.Полный механизм управляется конвейером Owin.

Вам необходимо получить контекст Owin, снять защиту токена и назначить его «AuthenticationTicket».(AuthenticationTicket является классом в «Microsoft.Owin.Security»)

public class AuthorizeTokenAttribute : System.Web.Http.AuthorizeAttribute
{
      public override void OnAuthorization(HttpActionContext actionContext)
       {
          SetUserContext(actionContext.Request.GetOwinContext()
       }

    private bool SetUserIdentity(IOwinContext context)
    {
        AuthenticationTicket authenticationTicket = 
        Startup.OAuthBearerAuthenticationOptions.AccessTokenFormat.Unprotect(token);

        context.Authentication.User = new System.Security.Claims.ClaimsPrincipal();                      
        context.Authentication.User.AddIdentity(authenticationTicket.Identity);


    }
}

После присвоения значения «User» указанным выше способом вы не получите User как null и сможете также получать Identityпосле назначения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...