Как получить вход в Windows в классе провайдера аутентификации Owin в веб-API? - PullRequest
0 голосов
/ 12 июня 2019

Я хочу получить Windows-вход пользователей в метод GrantResourceOwnerCredentials класса Provider и проверить их. Я перепробовал все возможные способы, как показано ниже, но не повезло.

  1. System.Security.Principal.WindowsIdentity.GetCurrent (). Name -> Возвращается имя сервера
  2. Request.LogonUserIdentity -> null (невозможно получить доступ до аутентификации)
  3. HttpContext.Current.User -> null

1 Ответ

0 голосов
/ 13 июня 2019

Насколько я понимаю, если вы используете только аутентификацию Windows, вам не нужно беспокоиться о GrantResourceOwnerCredentials. Вы пытаетесь использовать аутентификацию токена, а также аутентификацию Windows? вам следует использовать аутентификацию Windows только для веб-API, который будет работать в вашей интрасети.

Простите, если я скажу то, что вы уже знаете, но из проведенного мною исследования и моей благодарности Доминику Байеру по множественному мнению вам необходимо:

  • Установка пакетов nuget для Microsoft.Owin и Microsoft.Owin.Security.OAuth
  • Установите для проверки подлинности Windows значение «Включено» в проекте (окно свойств F4) или в файле конфигурации
  • Убедитесь, что у вас есть атрибут [Authorize] на вашем контроллере и он унаследован от ApiController
  • Специально реализуйте промежуточное программное обеспечение Owin (вам нужно будет создать три класса и убедиться, что они настроены в классе startup.cs). Посмотрите на следующий код:

1-й класс Middleware: объявить функцию

public class ClaimsTransformationOptions
{
    public Func<ClaimsPrincipal, Task<ClaimsPrincipal>> ClaimsTransformation { get; set; }
}

2-й класс промежуточного программного обеспечения: здесь метод Invoke

public class ClaimsTransformationMiddleware
{
    readonly ClaimsTransformationOptions _options;
    readonly Func<IDictionary<string, object>, Task> _next;

    public ClaimsTransformationMiddleware(Func<IDictionary<string, object>, Task> next, ClaimsTransformationOptions options)
    {
        _next = next;
        _options = options;
    }

    public async Task Invoke(IDictionary<string, object> env)
    {
        // use Katana OWIN abstractions (optional)
        var context = new OwinContext(env);

        if (context.Authentication != null &&
            context.Authentication.User != null)
        {
            var transformedPrincipal = await _options.ClaimsTransformation(context.Authentication.User);
            context.Authentication.User = new ClaimsPrincipal(transformedPrincipal);
        }

        await _next(env);
    }
}

3-й класс промежуточного программного обеспечения: это дополнительный класс

public static class ClaimsTransformationMiddlewareExtensions
{
    public static IAppBuilder UseClaimsTransformation(this IAppBuilder app,
        Func<ClaimsPrincipal, Task<ClaimsPrincipal>> transformation)
    {
        return app.UseClaimsTransformation(new ClaimsTransformationOptions
        {
            ClaimsTransformation = transformation
        });
    }

    public static IAppBuilder UseClaimsTransformation(this IAppBuilder app, ClaimsTransformationOptions options)
    {
        if (options == null)
        {
            throw new ArgumentNullException("options");
        }

        app.Use(typeof(ClaimsTransformationMiddleware), options);
        return app;
    }
}

В классе запуска:

public void Configuration(IAppBuilder app)
{
    app.UseClaimsTransformation(Transformation);
}
private async Task<ClaimsPrincipal> Transformation(ClaimsPrincipal incoming)
{
    if (!incoming.Identity.IsAuthenticated)
    {
        return incoming;
    }

    var name = incoming.Identity.Name;

    // go to a datastore - find the app specific claims

    var claims = new List<Claim>
    {
        new Claim(ClaimTypes.NameIdentifier, name),
        new Claim(ClaimTypes.Role, "foo"),
        new Claim(ClaimTypes.Email, "foo@foo.com")
    };

    var id = new ClaimsIdentity("Windows");
    id.AddClaims(claims);

    return new ClaimsPrincipal(id);
}

В контроллере (Убедитесь, что он имеет атрибут [Authorize] и наследуется от ApiController

public IEnumerable<ViewClaim> Get()
{
        var principal = User as ClaimsPrincipal;
        return  from c in principal.Claims
            select new ViewClaim
            {
                Type = c.Type,
                Value = c.Value
            };
}
...