Как игнорировать макет Identity Framework и просто использовать промежуточное ПО OWIN для получения претензий, которые я ищу?

Материал промежуточного программного обеспечения OWIN для интеграции сторонних пользователей в ваше приложение ASP.NET очень классный, но я не могу понять, как вырвать его из новой среды ID, которая заменяет скверный API-интерфейс членства. Я не заинтересован в сохранении полученных претензий и информации о пользователе в том, что настойчивость данных на основе EF, я просто хочу информацию о претензиях, поэтому я могу применить ее к своим собственным учетным записям пользователей в существующих проектах. Я не хочу использовать новую систему ID, чтобы воспользоваться этим материалом.

Я просматривал код на CodePlex, но там было много статической магии. Можете ли вы предложить какие-либо предложения?

Ответ 1

Используйте следующий код для настройки сред безопасности OWIN:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = "Application",
    AuthenticationMode = AuthenticationMode.Passive,
    LoginPath = new PathString("/Login"),
    LogoutPath = new PathString("/Logout"),
});

app.SetDefaultSignInAsAuthenticationType("External");

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = "External",
    AuthenticationMode = AuthenticationMode.Passive,
    CookieName = CookieAuthenticationDefaults.CookiePrefix + "External",
    ExpireTimeSpan = TimeSpan.FromMinutes(5),
});

app.UseGoogleAuthentication();

В приведенном выше коде устанавливаются файлы cookie приложений, внешние файлы cookie и внешние учетные записи Google. Средство промежуточного входа для внешнего входа преобразует данные внешнего входа пользователя в качестве идентификатора и устанавливает его на внешнее промежуточное программное обеспечение cookie. В вашем приложении вам нужно получить внешний идентификатор cookie и преобразовать его во внешние данные входа, затем вы можете проверить его с помощью пользователя db.

Вот пример кода.

Войдите в приложение cookie:

var authentication = System.Web.HttpContext.Current.GetOwinContext().Authentication;
var identity = new ClaimsIdentity("Application");
identity.AddClaim(new Claim(ClaimTypes.Name, "<user name>"));
authentication.AuthenticationResponseGrant = new AuthenticationResponseGrant(identity, new AuthenticationProperties() { 
    IsPersistent = false
});

Получить идентификатор cookie приложения:

var identity = System.Web.HttpContext.Current.User.Identity as ClaimsIdentity;

Получить внешний идентификатор cookie (Google):

var authentication = System.Web.HttpContext.Current.GetOwinContext().Authentication;
var result = await authentication.AuthenticateAsync("External");
var externalIdentity = result.Identity;

Извлечь внешние данные входа из идентификатора:

public static ExternalLoginData FromIdentity(ClaimsIdentity identity)
{
    if (identity == null)
    {
        return null;
    }

    Claim providerKeyClaim = identity.FindFirst(ClaimTypes.NameIdentifier);

    if (providerKeyClaim == null || String.IsNullOrEmpty(providerKeyClaim.Issuer)
        || String.IsNullOrEmpty(providerKeyClaim.Value))
    {
        return null;
    }

    if (providerKeyClaim.Issuer == ClaimsIdentity.DefaultIssuer)
    {
        return null;
    }

    return new ExternalLoginData
    {
        LoginProvider = providerKeyClaim.Issuer,
        ProviderKey = providerKeyClaim.Value,
        UserName = identity.FindFirstValue(ClaimTypes.Name)
    };
}