C # Проверка подлинности Microsoft Получение зарегистрированного пользователя с контроллера

Итак, у меня есть приложение Angular и C # Web API 2, в котором для входа используется аутентификация Microsoft (msal.js). Теперь я пытаюсь сохранить данные, и мне нужны данные о текущем зарегистрированном пользователе. Есть ли способ получить зарегистрированного пользователя из контроллера C #?

Я могу сделать это в Angular, но я думаю, что это небезопасно делать это со стороны клиента, поэтому я подумал, может быть, есть способ, которым серверная часть знает, кто зарегистрированный пользователь.

Заранее спасибо!

ИЗМЕНИТЬ

Startup.Auth.cs

  var tvps = new TokenValidationParameters
  {
    ValidAudience = "the id given from Microsoft Graph Registration", //xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    ValidateIssuer = false,
  };

  app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
  {
    AccessTokenFormat = new Microsoft.Owin.Security.Jwt.JwtFormat(tvps, new OpenIdConnectCachingSecurityTokenProvider("https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration"))
  });

frontend-login.ts

let userAgentApp = new UserAgentApplication(clientId, null,
    (errorDes: any, token: any, error: any, tokenType: any) => {
        userAgentApp.acquireTokenSilent(["user.read"]).then((token: string) => {});
    }, { redirectUri: 'http://localhost:port/signin-microsoft' });
userAgentApp.loginPopup(["user.read"]).then((token: string) => {
    //store the token and redirect to home page
});

ИЗМЕНИТЬ

Я использую его при доступе к API следующим образом:

this.headers.append('Authorization', 'Bearer ' + sessionStorage.getItem('token'));
this.http.get(`${this.url}`, { headers: this.headers })
  .map((response: Response) => { return response.json() })

ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ

Я разместил еще один вопрос по этому поводу, и там был дан ответ на эту проблему. Я размещаю ссылку ниже на случай, если она кому-то понадобится в будущем:

C # Web API 2 и Angular - Аутентификация учетной записи Microsoft


person Jed    schedule 08.02.2018    source источник
comment
Не могли бы вы попробовать var user = User.Identity   -  person Inept Adept    schedule 08.02.2018
comment
Ваш комментарий //store the token and redirect to home page предполагает, что вы где-то храните токен для дальнейшего использования. Можете ли вы опубликовать код, показывающий, как вы используете сохраненный токен при обращении к своему веб-API позже?   -  person Tewr    schedule 14.02.2018
comment
@Tewr обновил мой вопрос. Спасибо   -  person Jed    schedule 16.02.2018


Ответы (1)


В Web Api вам необходимо прочитать токен на предъявителя. Здесь есть руководство по этому вопросу в целом, но суть его заключается в том, чтобы использовать UseOAuthBearerAuthentication в вашем классе запуска при настройке конвейера owin, это позволит получить доступ в контроллерах при вызове RequestContext.Principal.

public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureOAuth(app);
        //Rest of code is here;
        }

        public void ConfigureOAuth(IAppBuilder app)
        {
            OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
                Provider = new SimpleAuthorizationServerProvider()
            };

            // Token Generation
            app.UseOAuthAuthorizationServer(OAuthServerOptions);
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

        }
    }
person Tewr    schedule 08.02.2018
comment
Совершенно пропустил WebApi часть .... Недостаточно кофе сегодня утром, хороший ответ :) - person Inept Adept; 08.02.2018
comment
Хорошее прочтение вашего комментария заставило меня перечитать и увидеть ошибку в моем ответе. Я просто пойду и обвиню и недостаточное количество кофе, удобно. - person Tewr; 08.02.2018
comment
Ха-ха, почему бы и нет: p - person Inept Adept; 08.02.2018
comment
Я настроил свой запуск для проверки подлинности Microsoft и использую msal.js. Но RequestContext.Principal.Identity.Name возвращает ноль. Есть ли другой, где я могу получить данные? Во внешнем интерфейсе я могу получить это с помощью UserAgentApplication.getUser(), но я хотел сделать это в MVC, если это возможно. - person Jed; 13.02.2018
comment
@Jed: Возможно, в вашем установочном коде есть ошибка или несоответствие. Вы должны опубликовать свой установочный код как на стороне клиента, так и на стороне сервера! Ваш startup.cs, а также ваш js для установки токена Bearer в обратных вызовах, выглядит ли он как это? - person Tewr; 13.02.2018
comment
Вы проверили наличие заголовка Bearer и вашего токена в нем, используя инструменты Chrome dev или скрипач? - person Tewr; 20.02.2018